re模块和分组

re模块和分组

分组命名

  • (?P<名字>正则表达式)
import re

s1 = "<h1>wahaha</h1>"
s2 = "<a>wahaha ya wahaha</a>"

ret = re.search("<(\w+)>(.*?)</\w+>",s1)
print(ret) #相当于ret.group(0)
print(ret.group(0))
print(ret.group(1))
print(ret.group(2))



import re

s1 = "<h1>wahaha</h1>"
s2 = "<a>wahaha ya wahaha</a>"

ret = re.search("<(?P<tag>\w+)>(?P<cont>.*?)</\w+>",s1) #给分组命名,注意中英文的?
print(ret) #相当于ret.group(0)
int(ret.group("tag")) #取得是tag分组的内容
print(ret.group("cont"))#取得是cont分组的内容
#输出结果
#<re.Match object; span=(0, 15), match='<h1>wahaha</h1>'>
#h1
#wahaha

引用分组

  • 前面创建分组,后面引用分组
  • 引用分组(?P=组名)这个组中的内容必须和之前已经存在的组匹配到的内容一模一样
s1 = "<h1>wahaha</h1>"
s2 = "<a>wahaha ya wahaha</a>"
import re
ret = re.search("<(?P<tag>\w+)>.*?</(?P=tag)>",s1)
print(ret)


import re
ret = re.search("<(?P<tag>\w+)>.*?</(?P=tag)>",s1)
print(ret.group("tag"))
#输出结果为h1


import re
ret = re.search(r"<(\w+)>.*?<(/\1)>",s1)
print(ret.group(1)
#输出结果为h1,
#与上面的方法达到的效果是一致的

      
#分组和findall
      #默认findall优先显示分组内的内容
      #取消分组优先显示(?:正则表达式)
import re
ret = re.findall("\d(\d)","aoel83")
#findall遇到正则表达式中的分组,会优先显示分组中的内容
print(ret)
#输出结果
#['3']

      
      
import re
ret = re.findall("\d+(\.\d+)?","12.234+2")
print(ret)
#输出结果
#['.234', ''] 
#因为是 优先分组内的内容内容,而?是持续匹配,因此2匹配了,但分组内无法显示
      
      
import re
ret = re.findall("\d+(\.\d+)","12.234+2")
print(ret)
#输出结果
#['.234']
      
import re
ret = re.findall("\d+(?:\.\d+)?","12.234+2")
print(ret)
#输出结果
#['12.234', '2']
#?:——>取消分组优先      
      
#split
      #会保留分组中本来应该被切割的内容
      
 #练习题
 #有时候我们想匹配的内容包含在不匹配的内容中,这个时候只需要把不想匹配的先匹配出来,再通过手段去掉     
import re      
ret = re.findall(r"\d+\.\d|\d+","1-2*(60+(-40.35/5)-(-4*3)") #——>可以匹配其中的小数
print(ret)  
#输出结果
#['1', '2', '60', '40.3', '5', '5', '4', '3'] 
      
import re
ret = re.findall(r"\d+\.\d|(\d+)","1-2*(60+(-40.35/5)-(-4*3)")
ret.remove("")#移除空格
print(ret) 
#输出结果
['1', '2', '60', '5', '5', '4', '3']      
posted @ 2021-06-14 15:35  小杨的冥想课  阅读(88)  评论(0编辑  收藏  举报