正则表达式                                                                                                                                                   

  • 匹配

    \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())