2009-03-27

使用python的正则表达式

正则表达式的功能主要有:
1. 替换
2. 在字符串查找有没有子字符串
3. 如果有,取得这个子字符串的信息,如它的起始和结束位置,它的内容等
4. 用子字符串分割字符串

python的和正则表达式有关的类都在re这个模块里.

1. 替换
re.sub(pattern, replacement, target[, count])用于把target里的pattern替换成replacement. count指定替换其中的多来个. 如果不指定count则执行全局替换,功能就类似于awk的gsub
re.sub和awk的sub/gsub的参数顺序都是一致的
>>> a="abc123abc"
>>> import re
>>> re.sub("[a-z]*", "ALPHA", a)
'ALPHA1ALPHA2ALPHA3ALPHA'
>>> a
'abc123abc'
>>> re.sub("[a-z]*", "ALPHA", a, 2)
'ALPHA1ALPHA23abc'

注意空匹配也被替换了. 例如上面的1和2两个数字之间的空的匹配也被替换成了ALPHA.

re.sub的replacement参数还可以是一个函数. 具体用法以后再谈...

2. 在字符串查找有没有子字符串
re.search(pattern, target[,flag])在target中寻找pattern,如果找到,就返回一个MatchObject,如果找不到,就返回None. MatchObject可以用于后面的确定pattern实际匹配的内容和位置等. 可选的flag用于指定像区不区分大小写等的选项
>>> pattern="""
#this is a comment"
\d
"""
>>> re.search(pattern, a, re.VERBOSE)
<_sre.sre_match>
>>> match = re.search(pattern, a, re.VERBOSE)
>>> match.start()
3
>>> match.end()
4
>>> a
'abc123abc'

MatchObject的使用稍后再叙述.
除了使用MatchObject来获得匹配的内容之外,还可以使用re.findall(pattern, target) re.finditer(pattern, target), 不过这时候就不能够指定像search那样的flag了. findall返回一个列表,列表的元素是匹配的内容,finditer则返回一个iterator对象,不过我暂时还不会使用这个对象.
>>> a
'abc123abc'
>>> re.findall("\d{3}", a)
['123']
>>> re.findall("[a-z]{3}", a)
['abc', 'abc']
>>> re.finditer("[a-z]{3}", a)

4. 分割字符串
在说明第3点之前,先说怎么分割字符串.
re.split(pattern, target[,max])用pattern把target分割开,返回一个列表. max指示侵害多少次
>>> re.split('\W+', 'Word, word, word')
['Word', 'word', 'word']
>>> re.split('(\W+)', 'Word, word, word')
['Word', ', ', 'word', ', ', 'word']
>>> re.split('\W+', 'Word, word, word',2)
['Word', 'word', 'word']
>>> re.split('\W+', 'Word, word, word',1)
['Word', 'word, word']
>>>

注意,如何在pattern两边有括号,则分隔符也在返回的列表当中.

re还有一个match方法,不过我觉得它没有多大的意义.....有兴趣的可以去查看文档

除了直接使用re的函数,还可以用re.compile(pattern[,flag])来返回一个RegexObject, 然后再调用上面的各种函数,不过这时候就不用指定函数的pattern参数了,因为compile里已经指定了。这种调用方式在要多次使用的时候同一正则表达式的时候可以提高效率。

search()返回的MatchObject的group([index])和groups([index])用于返回匹配的子串;start([index]),end([index])返回匹配的子串的起始和终止位置;还有一个span([index])返回(start([index]),end([index]))这样一个tuple。除了groups()以外,其他的index参数都是指第index个括号括起来的组,如果没有指定,就是指整个匹配的子串。


转载请注明出处 http://fornote.blogspot.com

没有评论:

发表评论