正则表达式:使用一种形式化语法描述的文本匹配模式,模式被解释为一组指令,然后会执行这组指令,以一个字符串作为输入,生成一个匹配的子集或原字符串的修改版本。表达式可以包括籽棉量文本匹配,重复,模式组合,分支以及其他复杂的规则。
一、查找文本中的模式
re最常见的用法就是搜索文本中的模式,search()函数取模式和要扫描的文本作为输入。如果找到这个模式则返回一个Match对象,如果未找到模式,search()将返回None
import re
pattern = "this"
text = "Does this text match the pattern?"
match = re.search(pattern,text)
s = match.start()
e = match.end()
print s,e,text[s:e]
start()和end()给出字符串中相应的索引位置。
二、编译表达式
re包含一些模块级函数,用于处理作为文本字符串的正则表达式,不过对于程序频繁使用的表达式,编译这些表达式会更有效,compile()函数会把一个表达式字符串转换为一个RegexObject。
import re
regexes = [re.compile( p )
for p in ["this", "that"]
]
for regex in regexes:
regex.pattern
if regex.search( text ):
print "ok!"
else:
print "bad!"
三、多重匹配
到目前位置,search()是来查找字面量文本字符串的单个事例,findall()函数会返回输入中与模式匹配而不重叠的所有子串。finditer()会返回一个迭代器,它将生成Match实例。
import re
text = "aabahdbagdbabgda"
pattern = "ab"
for match in re.findall( text ):
print match
for match in re.finditer( pattern, text ):
s = match.start()
e = match.end()
print s, e, text[s:e]
四、模式语法
正则表达式可以支持更强大的模式,模式可以重复,可以锚定到输入中不同的逻辑位置。
import re
def test_pattern(text,patterns=[]):
for pattern desc in patterns:
for match in re.finditer(pattern,text):
s = match.start()
e = match.end()
print s, e, text[s:e]
if __name__ =='__main__':
test_pattern('ababdhabsba',
[('ab','"a" followed by "b"'),
('ab*','a followed by one or more b'),
('ab+','"a" followed by zero or one b')
])
五、转义码
\d 一个数字
\D 一个非数字
\s 空白字符
\S 非空白字符
\w 字母数字
\W 非字母数字
六、锚定
可以使用锚定(anchoring)指令制定输入文本中模式应该出现的相对位置,下列是合法的锚定码:
^ 字符串或者行的开始
$ 字符串或者行的结束
\A 字符串开始
\Z 字符串结束
\b 一个单词开头或末尾的空串
\B 不在一个单词开头或末尾的空串
七,限定搜索
如果前提已经知道只需搜索整个输入的一个子集,可以告诉re限制搜索范围,从而进一步约束正则表达式匹配,例如,如果模式必须出现在输入的最前面,那么使用match()而不是search()会锚定搜索,而不必在搜索模式中显示的包含一个锚。这两个函数唯一的区别是:match从字符串的开头开始匹配,如果开头位置没有匹配成功,就算失败了;而search会跳过开头,继续向后寻找是否有匹配的字符串。针对不同的需要,可以灵活使用这两个函数。