Python re
注意!这不是re0!这是 Python 的正则表达式模块。Python 自1.5版本起增加了 re 模块,它提供 Perl 风格的正则表达式模式。
match 函数
match 函数尝试从字符串的起始位置匹配一个模式 pattern,如果不是起始位置匹配成功的话,match 就返回 None
re.match(pattern, string, flags = 0)
说直白点,他会看 string 的开头是否满足 pattern。这里的 flag 类似于修饰符。在 match 匹配成功后,会返回一个匹配对象 MatchObject。如果表达式内有分组,那么你可以下面这种方法来调用组:
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M \| re.I)
if matchObj:
print "matchObj.group() : ", matchObj.group()
print "matchObj.group(1) : ", matchObj.group(1)
print "matchObj.group(2) : ", matchObj.group(2)
else:
print "No match!!"
值得一提的是,line 后面的 re.M 和 re.I 就是修饰符,这个我们会进行对应。上面实例返回:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
如果你为分组进行了命名,你可以用 MatchObj.group('name') 调用这个分组。
在写 regexp 的时候,最好用 rawstring 以防一些奇怪的问题
span 方法
对于一个 matchObj,你可以调用它的 .span() 方法,用于在字符串中搜索模式并返回匹配的起始和结束位置。
start / end 方法
对于一个 matchObj,start() 返回匹配开始的位置,end() 返回匹配结束位置。
flags 修饰符
- re.I:忽略大小写
- re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
- re.M:多行模式
- re.S:即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
- re.U:表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
- re.X:为了增加可读性,忽略空格和 # 后面的注释
search 函数
re.search 扫描整个字符串并返回第一个成功的匹配。其格式和 match 一样。
re.search(pattern, string, flags = 0)
sub 函数
sub for substitute,这是用于替换的函数。
re.sub(pattern, repl, string, count=0, flags=0)
- pattern:模式
- repl:替换的字符串,也可为一个函数
- string:要被查找替换的原始字符串
- count:模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
普通情况我们不做赘述,下面为函数情况举一个例子:
# 将匹配的数字乘以 2
def double(matched):
value = int(matched.group('value'))
return str(value * 2)
s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))
回顾一下我们先前提到的分组命名,这里将识别到的组命名为 value。而显然,前面匹配到的结果会被输入到 double 函数中,所以字符串中的数字都会被乘2。
compile 函数
compile 函数用于编译正则表达式,生成一个模式对象 RegexObject,可以给 match 、search 以及 findall 等函数使用。
re.compile(pattern[, flags])
findall 方法
在编译完一个正则表达式之后,你可以调用Pattern Object的方法 findall。这个方法会在字符串中找到正则表达式所匹配的所有子串,并返回一个列表。如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
pattern.findall(string[, pos[, endpos]])
实例如:
pattern = re.compile(r'a') # 查找所有a
result1 = pattern.findall('xxxxxaaa')
result2 = pattern.findall('xxxxxaaa', 1, 3)
print(result1)
print(result2)
finditer 函数
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
re.finditer(pattern, string, flags=0)
split 函数
re 重载了 split 函数,使之能够支持正则表达式。
re.split(pattern, string[, maxsplit=0, flags=0])