一: re.findall
def findall(pattern, string, flags=0):
pattern: 正则表达式
string: 要匹配的字符串
flag:
返回结果:如果能够匹配到字符串,会将所有匹配到的字符串形成一个列表,然后返回,如果匹配不到,则返回一个空列表
import re ret1=re.findall('[a-z]+','wangys wc') ret2 =re.findall('[0-9]','wangys') print(ret1) print(ret2) # 结果 ['wangys', 'wc'] []
使用分组匹配的时候要注意优先级匹配,需要将优先级取消,才能取得正确的值
import re # 正常匹配 ret=re.findall('d+ww+','123wangys') print(ret) # ['123wangys'] # 使用分组正常匹配 ret1=re.findall('d+(ww+)','123wangys') print(ret1) # ['wangys'] # 结果不正常 # 使用分组匹配取消优先级匹配 ?:取消优先级 ret1=re.findall('d+(?:ww+)','123wangys') print(ret1) ['123wangys']
二:re.search
def search(pattern, string, flags=0):
pattern: 正则表达式
string: 要匹配的字符串
flag:
返回结果: 通过正则表达式匹配字符串,如果有匹配到一个就返回,返回的结果是包含匹配的字符串的对象,字符串可以使用group()的方法取得,如果没有匹配到返回None,在使用group方法时会报错
import re ret1=re.search('[a-z]+','wangys,xiaogongzu') print(ret1) print(ret1.group()) # <_sre.SRE_Match object; span=(0, 6), match='wangys'> # 如果匹配到就返回一个对象 # wangys # 使用group方法可以得到这个匹配结果,从结果上看,确实时第一个匹配结果会返回,后续的不会做为返回值返回 ret2=re.search('d+','wangys,xiaogongzu') print(ret2) print(ret2.group()) #None # 如果匹配不到就返回None # AttributeError: 'NoneType' object has no attribute 'group' # 当使用group方法会报错
# 在输出字符串之前使用group之前对结果进行判断 # 要么返回一个对象,要不返回None, # None为false import re ret = re.search('[a-z]+','wangys anyl') if ret: print(ret.group()) ret = re.search('[0-9]+','wangys anyl') if ret: print(ret.group())
三:re.match
match(pattern, string, flags=0)
pattern: 正则表达式
string: 要匹配的字符串
flag:
返回结果: 从字符串开始做匹配,跟search一样
ret1=re.match('[a-z]+','wangys,xiaogongzhu') print(ret1) print(ret1.group()) # <_sre.SRE_Match object; span=(0, 6), match='wangys'> # wangys ret2=re.match('[a-v]+','wangys,xiaogongzhu') print(ret2) print(ret2.group()) # None # AttributeError: 'NoneType' object has no attribute 'group'
同样为了防止报错,当使用group方法取出匹配的字符串时,要判断返回值是否为None
四:re.split
split(pattern, string, maxsplit=0, flags=0)
pattern: 正则表达式
string: 要匹配的字符串
maxsplit:
flag:
函数re.split()
是非常实用的,因为它允许你为分隔符指定多个正则模式, 返回结果为一个字段列表,这个跟str.split()
返回值类型是一样的
当你使用re.split()
函数时候,需要特别注意的是正则表达式中是否包含一个括号捕获分组。 如果使用了捕获分组,那么被匹配的文本也将出现在结果列表中
返回结果:将使用正则表达式将字符串分隔。
import re ret1 = re.split('[a-z]+','sdfasdf123sdfasf') print(ret1) ['', '123', '']
在使用分组匹配分隔是,会将分隔符也匹配进去
import re ret1=re.split('d','1wang4ys5') print(ret1) # ['', 'wang', 'ys', ''] 返回结果不会带有被匹配的字符串 ret1=re.split('(d)','1wang4ys5') print(ret1) # ['', '1', 'wang', '4', 'ys', '5', ''] 分组后也会将被匹配的字符串返回
多个分隔符时效果更佳(字符串的split方法只支持 单个分隔符)
import re line = 'asdf fjdk; afed, fjek,asdf, foo' result = re.split(r'[;,s]s*', line) print(result) result = re.split(r'(?:;|,|s)s*', line) print(result)
五:re.sub
sub(pattern, repl, string, count=0, flags=0)
pattern: 正则表达式
repl: 要替换的字符串
string: 要匹配的字符串
count:
flag:
用于字符串替换
import re ret = re.sub('d+','wangys','123wangys') print(ret) # 将匹配到的数字替换成字符串‘wangys’
六 re.subn
subn(pattern, repl, string, count=0, flags=0)
pattern: 正则表达式
repl: 需要替换的字符串
string: 要匹配的字符串
count:
flag:
返回结果:替换字符串,并将结果和替换次数组成一个元祖的形式返回
import re ret=re.subn('d','H','123wangys') print(ret)
# ('HHHwangys', 3)
import re obj = re.compile('d{3}') # 将正则表达式编译成了一个正则对象 ret = obj.findall('wangys123yl456') # 使用该对象匹配字符串 print(ret) # 返回结果
7: re.finditer
finditer(pattern, string, flags=0)
pattern: 正则表达式
string: 要匹配的字符串
flag:
返回结果是一个迭代器,取出的值是对象,不是真正的字符串,需要使用group方法取到
import re ret = re.finditer('[a-z]+','wangys123xiao') print(ret) for i in ret: print(i) # <callable_iterator object at 0x0000027B7C12D2B0>返回结果是一个可调用的迭代器对象 # <_sre.SRE_Match object; span=(0, 6), match='wangys'> # <_sre.SRE_Match object; span=(9, 13), match='xiao'> import re ret = re.finditer('[a-z]+','wangys123xiao') print(ret) for i in ret: print(i.group()) # <callable_iterator object at 0x0000024A15E9D2E8> # wangys # xiao
flags有很多可选值: re.I(IGNORECASE)忽略大小写,括号内是完整的写法 re.M(MULTILINE)多行模式,改变^和$的行为 re.S(DOTALL)点可以匹配任意字符,包括换行符 re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 w, W, , B, s, S 依赖于当前环境,不推荐使用 re.U(UNICODE) 使用w W s S d D使用取决于unicode定义的字符属性。在python3中默认使用该flag re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释
八:练习题
import re name = "<h1>hello</h1>" # ret = re.search('<w+>w+</w+>',name) ret = re.search('<(?P<tag_name>w+)>w+</(?P=tag_name)>',name) print(ret.group()) print(ret.group('tag_name')) # 可以输出tag_name这个分组的值是多少
# 使用序号来应用分组匹配 import re name = "<h1>hello</h1>" ret = re.search(r'<(w+)>w+</1>',name) print(ret.group()) print(ret.group(1)) # 可以通过组id取出匹配的字符串
1、 匹配一段文本中的每行的邮箱
http://blog.csdn.net/make164492212/article/details/51656638
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、 匹配出所有整数
实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序