正则表达式
匹配
\d 匹配一个数字
\w 匹配一个字母或一个数字
\s 匹配一个空格或tab空白符
\b 匹配字符边界
\\s 匹配任何空白字符,包括空格、制表符、回车\r、换行\n
以上特殊字符变成大写,表示与之相反。
\N 匹配已保存的子组
^或\A 匹配字符串的开始
$或\Z 匹配字符串的结束
. 匹配任意一个字符
.*? 惰性匹配,表示匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。如:a.*?b,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab
个数
+ 表示其前面的字符串至少出现了一次
? 表示其前面的字符出现了一次或零次
* 表示其前面的字符出现了任意次,可能是零次、一次或多次
{n} 表示其前面的字符串出现了n次
{n,m} 可以表示其前面的字符串出现了n-m次
[] 匹配一个范围,例如[0-9a-zA-Z\_]
可以匹配一个数字、字母或者下划线,[]中以^开头表示"非"
转义
\ 表示转义
r'' 引号中的特殊字符会被转义(建议使用这种,不用考虑转义问题)
re模块
match()方法 判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。常见语法如下:
str = '用户输入的字符串' re.match(r'正则表达式',str,flags)
例如:
import re find1 = re.match(r'\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}','127.0.0.1') print("find1:%s,%s"%(find1,find1.group())) #打印内容 find1:<_sre.SRE_Match object; span=(0, 9), match='127.0.0.1'>,127.0.0.1
search()方法 在指定的字符串中,查找第一个能够匹配成功的字符串,如果匹配成功,返回一个Match对象,否则返回None。常见语法如下:
str = '用户输入的字符串' re.search(r'正则表达式',str,flags)
例如:
str = 'my phone is 15810740000 ,my friend\'s phone is 12346010473' find2 = re.search(r'\d{11}',str) print("find2:%s,%s"%(find2,find2.group())) #打印内容 find2:<_sre.SRE_Match object; span=(12, 23), match='15810740000'>,15810740000
findall()方法 在指定的字符串中,查找所有匹配成功的字符串,如果匹配成功,返回一个列表,包含所有匹配成功的字符串,否则返回空列表。常见语法如下:
str = '用户输入的字符串' re.findall(r'正则表达式',str,flags)
例如:
str = 'my phone is 15810740000 ,my friend\'s phone is 12346010473' find3 = re.findall('\d{11}',str) print("find3:%s"%find3) #打印内容 find3:['15810740000','12346010473']
finditer()方法 与findall类似,只不过返回的是个callable_iterator迭代器,python2中支持next方法去遍历,python3中不支持。常见语法如下:
str = '用户输入的字符串' re.finditer(r'正则表达式',str,flags)
例如:
str = 'my phone is 15810740000 ,my friend\'s phone is 12346010473' find4 = re.finditer('\d{11}',str) for i in find4: print("find4:%s,%s"%(i,i.group())) #打印内容 find4:<_sre.SRE_Match object; span=(12, 23), match='15810740000'>,15810740000 find4:<_sre.SRE_Match object; span=(46, 57), match='12346010473'>,12346010473
sub()、subn()方法 搜索和替换,sub返回替换后的字符串,subn返回一个元组,元素分别是替换后的字符串和替换的个数。如果没有正确的匹配替换,将返回原字符串,常见语法如下:
str = '用户输入的字符串' re.sub(r'正则表达式',repl,str,count=0) re.subn(r'正则表达式',repl,str,count=0) #使用repl替换正则表达式在str中匹配的部分,如果指定count个数,将替换对应的个数,否则将全部替换
例如:
str = 'my phone is 15810740000 ,my friend\'s phone is 12346010473' sub1 = re.sub('(\d{11})',r'+86 \1',str) print("sub1:%s"%(sub1)) sub2 = re.subn('(\d{11})',r'+86 \1',str) print("sub2:%s,共替换%s处"%(sub2)) #打印内容 sub1:my phone is +86 15810740000 ,my friend's phone is +86 12346010473 sub2:my phone is +86 15810740000 ,my friend's phone is +86 12346010473,共替换2处
注:在sub1、sub2正则表达式中都用了一个'\1',表示的就是匹配的字符串。
'(\d{11})'用了小括号,表示分组,'\1'表示分组的编号,这里只有一对小括号(一组),'\1'对应的就是全部匹配字符串。
split()方法 与字符串分割的方法类似,但是功能更加强大,常见语法如下:
str = '用户输入的字符串' re.split('正则表达式',str,maxsplit=0) #指定maxsplit个数只分割对应的个数,不指定将全部分割。python2中该参数为max
例如:
str = 'root:x:0:0:root:/root:/bin/bash' print(re.split(':',str,maxsplit=5)) #打印内容 ['root', 'x', '0', '0', 'root', '/root:/bin/bash']
补充:
匹配对象的方法group(num=0)和groups() group()返回匹配对象整个匹配的结果,对于含有子组的匹配对象来说,指定num,将返回对应的子组;groups()返回一个元组,包含匹配的每个子组,如果没有成功匹配,返回一个空元组,例如:
import re str = '158107470000@163.com' reg = r'(\w+)@(\w+).com' find1 = re.match(reg,str) print(find1.group(),find1.group(1),find1.group(2)) print(find1.groups()) #打印内容 158107470000@163.com 158107470000 163 ('158107470000', '163')
通过group(1)、group(2)这种指定索引打印某个子组外,还可以为每个子组指定一个组名,通过group('组名')来打印某个子组,需要注意的是组名不能重复,例如:
import re req = re.search('(?P<id>\d{3})/(?P<name>\w{4})','message 001/fjca') #(?P<id>\d{3})两部分,?P<id>指定组名为id,\d{3}指定要匹配的内容。 print(req.group()) print(req.group('id')) print(req.group('name')) #打印内容 001/fjca 001 fjca
常用属性 re模块还包括一些常用的属性,可以在匹配时作为flags使用,如下:
#re.I、re.IGNORECASE 不区分大小写的匹配 #re.L、re.LOCALE 根据所使用的本地语言环境通过\w、\W、\b、\B、\s、\S 实现匹配 #re.M、re.MULTILINE ^和$分别匹配目标字符串中行的起始和结尾,而不是严格匹配整个字符串本身的起始和结尾 #re.S、rer.DOTALL “.”(点号)通常匹配除了\n(换行符)之外的所有单个字符;该标记表示“.”(点号)能够匹配全部字符 #re.X、re.VERBOSE 通过反斜线转义,否则所有空格加上#(以及在该行中所有后续文字)都被忽略,除非在一个字符类中或者允许注释并且提高可读性
分组
() 小括号中匹配的分为一组,常用功能:简洁代码、字串提取,例如:
#匹配ip地址,相同的部分写成了一组 import re re.match(r'(\d{1,3}.){3}\d{1,3}','127.0.0.1')
#识别时间,提取小时、分钟、秒 import re t = '23:05:30' m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t) print (m.groups())