注意!这不是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.Mre.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 方法

对于一个 matchObjstart() 返回匹配开始的位置,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,可以给 matchsearch 以及 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])