一: re.findall
def findall(pattern, string, flags=0):
pattern: 正则表达式
string: 要匹配的字符串
flag:
返回结果:如果能够匹配到字符串,会将所有匹配到的字符串形成一个列表,然后返回,如果匹配不到,则返回一个空列表
importre
ret1=re.findall('[a-z]+','wangys wc')
ret2=re.findall('[0-9]','wangys')print(ret1)print(ret2)#结果
['wangys', 'wc']
[]
使用分组匹配的时候要注意优先级匹配,需要将优先级取消,才能取得正确的值
importre#正常匹配
ret=re.findall('\d+w\w+','123wangys')print(ret)#['123wangys']
#使用分组正常匹配
ret1=re.findall('\d+(w\w+)','123wangys')print(ret1)#['wangys'] # 结果不正常
#使用分组匹配取消优先级匹配 ?:取消优先级
ret1=re.findall('\d+(?:w\w+)','123wangys')print(ret1)
['123wangys']
二:re.search
def search(pattern, string, flags=0):
pattern: 正则表达式
string: 要匹配的字符串
flag:
返回结果: 通过正则表达式匹配字符串,如果有匹配到一个就返回,返回的结果是包含匹配的字符串的对象,字符串可以使用group()的方法取得,如果没有匹配到返回None,在使用group方法时会报错
importre
ret1=re.search('[a-z]+','wangys,xiaogongzu')print(ret1)print(ret1.group())#<_sre.sre_match object span="(0," 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
importre
ret= re.search('[a-z]+','wangys anyl')ifret:print(ret.group())
ret= re.search('[0-9]+','wangys anyl')ifret: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," 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() 函数时候,需要特别注意的是正则表达式中是否包含一个括号捕获分组。 如果使用了捕获分组,那么被匹配的文本也将出现在结果列表中
返回结果:将使用正则表达式将字符串分隔。
importre
ret1= re.split('[a-z]+','sdfasdf123sdfasf')print(ret1)
['', '123', '']
在使用分组匹配分隔是,会将分隔符也匹配进去
importre
ret1=re.split('\d','1wang4ys5')print(ret1)#['', 'wang', 'ys', ''] 返回结果不会带有被匹配的字符串
ret1=re.split('(\d)','1wang4ys5')print(ret1)#['', '1', 'wang', '4', 'ys', '5', ''] 分组后也会将被匹配的字符串返回
多个分隔符时效果更佳(字符串的split方法只支持 单个分隔符)
importre
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:
用于字符串替换
importre
ret= re.sub('\d+','wangys','123wangys')print(ret)#将匹配到的数字替换成字符串‘wangys’
六 re.subn
subn(pattern, repl, string, count=0, flags=0)
pattern: 正则表达式
repl: 需要替换的字符串
string: 要匹配的字符串
count:
flag:
返回结果:替换字符串,并将结果和替换次数组成一个元祖的形式返回
importre
ret=re.subn('\d','H','123wangys')print(ret)
# ('HHHwangys', 3)
importre
obj= re.compile('\d{3}') #将正则表达式编译成了一个正则对象
ret = obj.findall('wangys123yl456') #使用该对象匹配字符串
print(ret) #返回结果
7: re.finditer
finditer(pattern, string, flags=0)
pattern: 正则表达式
string: 要匹配的字符串
flag:
返回结果是一个迭代器,取出的值是对象,不是真正的字符串,需要使用group方法取到
importre
ret= re.finditer('[a-z]+','wangys123xiao')print(ret)for i inret:print(i)#返回结果是一个可调用的迭代器对象#<_sre.sre_match object span="(0," match="wangys">#<_sre.sre_match object span="(9," match="xiao">
importre
ret= re.finditer('[a-z]+','wangys123xiao')print(ret)for i inret:print(i.group())##wangys#xiao
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字符串可以是多行的,忽略空白字符,并可以添加注释
八:练习题
importre
name= "
hello
"#ret = re.search('\w+\w+>',name)
ret = re.search('\w+)>\w+(?P=tag_name)>',name)print(ret.group())print(ret.group('tag_name')) # 可以输出tag_name这个分组的值是多少
#使用\序号来应用分组匹配
importre
name= "
hello
"ret= re.search(r'\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) )等类似公式的计算器程序