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']
记录学习的点点滴滴