在Python中,通过内置的re模块提供对正则表达式的支持。
re模块中的方法
方法 | 功能 | 返回值 |
---|---|---|
compile(pattern[, flags]) | 根据包含正则表达式的字符串创建模式对象 | re对象 |
search(pattern, string[, flags]) | 在字符串中查找 | 第一个匹配到的对象或者None |
match(pattern, string[, flags]) | 在字符串的开始处匹配模式 | 在字符串开头匹配到的对象或者None |
split(pattern, string[, maxsplit=0,flags]) | 根据模式的匹配项来分割字符串 | 分割后的字符串列表 |
findall(pattern, string,flags) | 列出字符串中模式的所有匹配项 | 所有匹配到的字符串列表 |
sub(pat,repl, string[,count=0,flags]) | 将字符串中所有的pat的匹配项用repl替换 | 完成替换后的新字符串 |
finditer(pattern, string,flags) | 将所有匹配到的项生成一个迭代器 | 所有匹配到的字符串组合成的迭代器 |
subn(pat,repl, string[,count=0,flags]) | 在替换字符串后,同时报告替换的次数 | 完成替换后的新字符串及替换次数 |
escape(string) | 将字符串中所有特殊正则表达式字符串转义 | 转义后的字符串 |
purge(pattern) | 清空正则表达式 | |
template(pattern[,flags]) | 编译一个匹配模板 | 模式对象 |
fullmatch(pattern, string[, flags]) | match方法的全字符串匹配版本 | 类似match的返回值 |
其中
pattern指的是匹配的正则表达式
string是要匹配的字符串。
maxsplit、count为次数
flags是标志位,用于控制正则表达式的匹配方式,包含下列标志
可选标志 | 功能 |
---|---|
re.I | 不区分大小写 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解 |
r原生字符串
与大多数编程语言相同,正则表达式里使用\作为转义字符,但有时使用了太多的\会影响美观已经,并且麻烦,使用原生字符串的话,匹配一个数字的"\\d"可以直接写成r"\d"。
match方法
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
语法
import re
string = 'abc123'
rstr = re.match(r'abc', string)
print(rstr)
print(rstr.span())
# <re.Match object; span=(0, 3), match='abc'>
# (0,3)
其中m.span() 返回一个tuple表示(m.start(), m.end()) ,类似的还有
m.start() :返回起始位置,m.end()返回结束位置(不包含该位置的字符).
m.finditer():可以返回一个iterator,用来遍历所有找到的MatchObject.
我们还可以使用group() 或 groups() 匹配对象函数来获取匹配表达式。
group() 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组
groupdict() 返回获取模型中匹配到的分组中所有key的字典
import re
a = "123abc456"
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)) # 123abc456,返回整体
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)) # 123
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)) # abc
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)) # 456
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).groups()) # ('123', 'abc', '456')
print(re.search("([0-9]*)([a-z]*)(?P<num>[0-9]*)",a).groupdict()) # {'num': '456'}
search方法
re的search方法和match方法大致相同,差别就是re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
compile方法
compile方法用于将字符串形式的正则表达式编译为Pattern模式对象,可以实现更高效率的匹配。
import re
pat = re.compile(r"abc")
pat.match("abc123")
<_sre.SRE_Match object; span=(0, 3), match='abc'>
经过compile()方法编译过后的返回值是个re对象,它可以调用match()、search()、findall()等其他方法
findall方法
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
并且findall没有group方法
import re
obj = re.findall(r"abc","123abc456abc")
print(obj)
# ['abc', 'abc']
split方法
re模块的split()方法和字符串的split()方法很相似,都是利用特定的字符去分割字符串。但是re模块的split()可以使用正则表达式,因此会更加的灵活。
import re
s = "9+7*5+4/3"
lis = re.split(r"[\+\-\*\/]",s)
print(lis)
# ['9', '7', '5', '4', '3']
split有个参数maxsplit,可以用于指定分割的次数:
import re
s = "9+7*5+4/3"
lis = re.split(r"[\+\-\*\/]", s, maxsplit=2)
print(lis)
# ['9', '7', '5+4/3']
sub方法
sub()方法类似字符串的replace()方法,用指定的内容替换匹配到的字符,可以指定替换次数。
import re
shell = "djkfgjksff # 这是一串神秘代码"
# 删除字符串中的 Python注释
new_s = re.sub(r'#.*$', "", shell)
print(new_s)
# djkfgjksff
repl参数不仅仅可以是新的字符串,也可以是一个函数
import re
# 将匹配的数字乘以 2
def double(matched):
value = int(matched.group('num'))
return str(value * 2)
s = 'ASD45DG4HG65'
print(re.sub('(?P<num>\d+)', double, s))
# ASD90DG8HG130