1、匹配标签
import re
ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>", "<h1>hello</h1>")
# 可以再分组中利用 ?P<name> 的形式给分组起名字,后面的 ?P=tag_name 是引用前面的分组
# 获取的匹配结果可以直接用 group('name') 拿到对应的值
print(ret.group('tag_name')) # 结果:h1
print(ret.group()) # 结果:<h1>hello</h1>
ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
# 如果不给组起名字,也可以用 \序号 来找到对应的组,表示要找的内容和前面的组内容一致
# 获取的匹配结果可以直接用 group(序号) 拿到对应的值
print(ret.group(1)) # 结果:h1
print(ret.group()) # 结果:<h1>hello</h1>
2、匹配整数
import re
ret = re.findall(r"\d+", "1-2*(60+(-40.35/5)-(-4*3))")
print(ret) # 结果:['1', '2', '60', '40', '35', '5', '4', '3']
ret = re.findall(r"-?\d+\.\d*|(?:-?\d+)", "1-2*(60+(-40.35/5)-(-4*3))")
print(ret) # 结果:['1', '-2', '60', '-40.35', '5', '-4', '3']
ret = re.findall(r"-?\d+\.\d*|(-?\d+)", "1-2*(60+(-40.35/5)-(-4*3))") # 分组优先
print(ret) # 结果:['1', '-2', '60', '', '5', '-4', '3']
ret.remove("")
print(ret) # 结果:['1', '-2', '60', '5', '-4', '3']
3、数字匹配
# 1、 匹配一段文本中的每行的邮箱
s = 'http://blog.****.net/make164492212/article/details/51656638'
ret = re.search(r"\w+.\w+.\w+",s)
print(ret.group()) # blog.****.net
# 2、 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’;
#
# 分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、
# 一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$
#
# 3、 匹配qq号。(腾讯QQ号从10000开始) [1,9][0,9]{4,}
#
# 4、 匹配一个浮点数。 ^(-?\d+)(\.\d+)?$ 或者 -?\d+\.?\d*
#
# 5、 匹配汉字。 ^[\u4e00-\u9fa5]{0,}$
#
# 6、 匹配出所有整数
4、flag
flags有很多可选值:
re.I(IGNORECASE)忽略大小写,括号内是完整的写法
re.M(MULTILINE)多行模式,改变^和$的行为
re.S(DOTALL)点可以匹配任意字符,包括换行符
re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境,不推荐使用
re.U(UNICODE) 使用\w \W \s \S \d \D使用取决于unicode定义的字符属性。在python3中默认使用该flag
re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释