编译正则表达式
正则表达式被编译成 RegexObject
实例,可以为不同的操作提供方法,如模式匹配搜索或字符串替换。
#!python
import re
p = re.compile(‘ab*’)
print p
<_sre.SRE_Pattern object at 0xb76e1a70>
re.compile() 也接受可选的标志参数,常用来实现不同的特殊功能和语法变更。我们稍后将查看所有可用的设置,但现在只举一个例子:
#!python
p = re.compile(‘ab*’, re.IGNORECASE)
RE 被做为一个字符串发送给 re.compile()。REs 被处理成字符串是因为正则表达式不是 Python 语言的核心部分,也没有为它创建特定的语法。(应用程序根本就不需要 REs,因此没必要包含它们去使语言说明变得臃肿不堪。)而 re 模块则只是以一个 C 扩展模块的形式来被 Python 包含,就象 socket 或 zlib 模块一样
一些正则表达式的应用
#!python
m.group()
‘tempo’m.start(), m.end()
(0, 5)m.span()
(0, 5)
group() 返回 RE 匹配的子串。start() 和 end() 返回匹配开始和结束时的索引。span() 则用单个元组把开始和结束时的索引一起返回。因为匹配方法检查到如果 RE 在字符串开始处开始匹配,那么 start() 将总是为零。然而,RegexObject
实例的 search 方法扫描下面的字符串的话,在这种情况下,匹配开始的位置就也许不是零了。
#!python
print p.match(’::: message’)
Nonem = p.search(’::: message’) ; print m
<re.MatchObject instance at 80c9650>m.group()
‘message’m.span()
(4, 11)
在实际程序中,最常见的作法是将MatchObject
保存在一个变量里,然後检查它是否为 None,通常如下所示:
#!python
p = re.compile( … )
m = p.match( ‘string goes here’ )
if m:
print 'Match found: ', m.group()
else:
print ‘No match’
两个 RegexObject
方法返回所有匹配模式的子串。findall()返回一个匹配字符串行表:
#!python
p = re.compile(’\d+’)
p.findall(‘12 drummers drumming, 11 pipers piping, 10 lords a-leaping’)
[‘12’, ‘11’, ‘10’]
findall() 在它返回结果时不得不创建一个列表。在 Python 2.2中,也可以用 finditer() 方法。
#!python
iterator = p.finditer(‘12 drummers drumming, 11 … 10 …’)
iterator
<callable-iterator object at 0x401833ac>for match in iterator:
… print match.span()
…
(0, 2)
(22, 24)
(29, 31)