re 模块是 python 匹配字符串的模块,基于正则表达式实现,此模块为python 特有的,模块方法介绍:
1、match(pattern, string, flags=0) 函数
从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
- pattern:正则模型,所有编程语言都可使用,
- string:要匹配的字符串
- flags:匹配模式,有如下选项可选:
修饰符 | 描述 |
re.I | 忽略大小写 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
示例:
import re
str="hello sss fff hhh hello nnn kkk werty"
r=re.match("h\w+",str) #match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None,非字母,汉字,数字及下划线分割
print(r.group()) #获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
print(r.groups()) # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
print(r.groupdict()) # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
print("-"*30)
r2=re.match("h(\w+)",str)
print(r2.group())
print(r2.groups())
print(r2.groupdict())
print("-"*30)
r3=re.match("(?P<n1>h)(?P<n2>\w+)",str) #?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容
print(r3.group())
print(r3.groups())
print(r3.groupdict())
print("-"*30)
运行结果:
hello
()
{}
------------------------------
hello
('ello',)
{}
------------------------------
hello
('h', 'ello')
{'n1': 'h', 'n2': 'ello'}
------------------------------
用group(num=0) 或 groups() 等匹配对象函数来获取匹配表达式
2、search(pattern, string, flags=0) 函数
match()函数 与 search()函数基本是一样的功能,不一样的就是match()匹配字符串开始位置的一个符合规则的字符串,search()是在字符串全局匹配第一个合规则的字符串
示例:
import re
str="sss fff hhh hello nnn kkk werty hello"
r=re.search("h\w+",str)
print(r.group()) #获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
运行结果:
hhh
3、compile(pattern,flags=0) 返回一个正则对象,
以上的调用的 search() 函数写法等同于下:
str="sss fff hhh hello nnn kkk werty hello"
prog = re.compile("h\w+")
r = prog.search(str).group()
print(r)
若多个字符串都是使用同一个正则表达式去匹配是,使用complie() 函数,就只需要调用一次_compile(),若用以上的search()函数则_compile()会被调用3次,如下所示:
import re
strs =["aaaa bbb ssss","qqqq awww ee","iiipapppplll"]
patt =re.compile(r'a\w',re.I)
for item in strs:
print(patt.search(item).group())
上例中的 r’a\w’, r 为原生字符,将在python里有特殊意义的字符如\b,转换成原生字符(就是去除它在python的特殊意义),不然会给正则表达式有冲突,为了避免这种冲突可以在规则前加原始字符r
4、findall(pattern, string, flags=0)
浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中,未匹配成功返回空列表
注意:一旦匹配成,再次匹配,是从前一次匹配成功的,后面一位开始的
import re
r=re.findall("\d+\w\d+","a2b3c4d5") #浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串方到一个列表中
print(r)
运行结果:匹配成功的字符串,不再参与下次匹配,所以3c4也符合规则但是没有匹配到
['2b3', '4d5']
注意:正则匹配到空字符的情况,如果规则里只有一个组,而组后面是就表示组里的内容可以是0个或者多过,这样组里就有了两个意思,一个意思是匹配组里的内容,二个意思是匹配组里0内容(即是空白)所以尽量避免用否则会有可能匹配出空字符串
注意:正则只拿组里最后一位,如果规则里只有一个组,匹配到的字符串里在拿组内容是,拿的是匹配到的内容最后一位
import re
r=re.findall("(ca)*","ca2b3caa4d5") #浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串方到一个列表中
print(r)
运行结果:
['ca', '', '', '', 'ca', '', '', '', '', '']#用*号会匹配出空字符
无分组:匹配所有合规则的字符串,匹配到的字符串放到一个列表中
import re
r=re.findall("a\w+","ca2b3 caa4d5") #浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串方到一个列表中
print(r)
运行结果:#匹配所有合规则的字符串,匹配到的字符串放入列表
['a2b3', 'aa4d5']
有分组:只将匹配到的字符串里,组的部分放到列表里返回,相当于groups()方法
import re
r=re.findall("a(\w+)","ca2b3 caa4d5") #有分组:只将匹配到的字符串里,组的部分放到列表里返回
print(r)
运行结果:#返回匹配到组里的内容
['2b3', 'a4d5']
?:在有分组的情况下findall()函数,不只拿分组里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正则对象的函数如findall()
import re
r=re.findall("a(?:\w+)","a2b3 a4b5 edd") #?:在有分组的情况下,不只拿分组里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正则对象的函数如findall()
print(r)
运行结果:
['a2b3', 'a4b5']
5、split(pattern, string, maxsplit=0, flags=0)
根据正则匹配分割字符串,返回分割后的一个列表
- pattern:正则模型
- string:要匹配的字符串
- maxsplit:指定分割个数
- flags:匹配模式
import re
r =re.split("a\w","sssabbbbaccccawdd")
print(r)
r1=re.split("a\w","sssabbbbaccccawdd",maxsplit=2)
print(r1)
运行结果:
['sss', 'bbb', 'ccc', 'dd']
['sss', 'bbb', 'cccawdd']
6、sub(pattern, repl, string, count=0, flags=0)
替换匹配成功的指定位置字符串
- pattern:正则模型
- repl: 要替换的字符串
- string:要匹配的字符串
- count:指定匹配个数
- flags:匹配模式
import re
r=re.sub("a\w","替换","sdfadfdfadsfsfafsff")
print(r)
运行结果:
sdf替换fdf替换sfsf替换sff
7、subn(pattern, repl, string, count=0, flags=0)
替换匹配成功的指定位置字符串,
Return a 2-tuple containing (new_string, number)
a,b=re.subn(r'a\w',"替换成我","aabbbbbcaaa")
print("a=",a)
print("b=",b)
运行结果:
a= 替换成我bbbbbc替换成我a
b= 2
正则表达式全集
正则表达式有多种不同的风格。下表是在PCRE中元字符及其在正则表达式上下文中的行为的一个完整列表: