re模块和分组


re模块和分组

分组命名

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

s1 = "

wahaha

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

wahaha

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

引用分组

  • 前面创建分组,后面引用分组
  • 引用分组(?P=组名)这个组中的内容必须和之前已经存在的组匹配到的内容一模一样
s1 = "

wahaha

" s2 = "wahaha ya wahaha" import re ret = re.search("<(?P\w+)>.*?",s1) print(ret) import re ret = re.search("<(?P\w+)>.*?",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']