BLOG
Enjoy when you can, and endure when you must.
DEC 16, 2013/Python
正则表达式语法与re模板的简单应用

正则表达式经常被用于字符串的处理中,特别是一些使用普通处理不方便或较为复杂的环境。在Python标准库中,re模块提供了这方面的功能。不过首先,了解正则表达式的基本语法规则是必要的。其实这并不需要我介绍,因为相关的材料实在太多了,这里推荐给大家一张图片,总结的很详细(以下是一部分,点击可以查看全部)。

那接下来就是运用该语法并结合re模块来完成相应的需求。我想最常用的会是re.match和re.search,这两个方法都是尝试在字符串中匹配一个模式,如下面的示例,我们想匹配出Hello和World两个单词之间有什么内容:

>>> text = 'Hello spam! World'
>>> match = re.match('Hello(.+)World', text)
>>> match
<_sre.SRE_Match object at 0x0283A5E0>

如果匹配成功,可以得到一个match对象,它本身提供很多方法(具体可以参考官方文档),这里我们关心的是把匹配的内容找出来,这要用到其中的group方法,它返回一个或多个匹配成功的组。

>>> match.group(0)
'Hello spam! World'    # 整个匹配
>>> match.group(1)
' spam! '              # 子匹配,括号内的部分

当然,你也可以使用match.groups:

>>> match.groups()
(' spam! ',)

对于刚才的例子,我们把re.match换用re.search得到的结果将会是一样的,这是因为我们的例子有些特殊。这两个方法的区别在于re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。下面这个简单的例子我想能说明这一点:

>>> re.search('(\d+)', 'hello world 123')
<_sre.SRE_Match object at 0x02837AE0>
>>> re.match('(\d+)', 'hello world 123')
>>>

我们想要匹配出字符串末尾的数字部分,因为search是在整个字符串中寻找,因此可以正确匹配到;match则不行了,因为它从一开始就匹配,一旦匹配不成功就返回None。

如果一个正则表达式会经常被使用到,那封装成一个正则表达式对象会获得更好的效率,这就用到了re.compile。

>>> prog = re.compile('Hello(.+)World')
>>> match = prog.match('Hello spam! World')
>>> match
<_sre.SRE_Match object at 0x02837AE0>
>>> match.group(1)
' spam! '

这样prog这个正则表达式对象就可以被多次使用了。

看看其他的,在字符串处理中,我们经常会利用关键字拆分字符串,比如空格:

>>> s = 'this is great'
>>> s.split()
['this', 'is', 'great']

不过如果是这样一个字符串呢?

this123is4567great

它的规律在于每个单词之间以多个数字隔开。字符串的split可无能为力了。不过对于re.split,这就是它的强项:

>>> s = 'this123is4567great'
>>> re.split('\d+', s)
['this', 'is', 'great']

这些只是在我的使用中用得比较频繁的方法,真正要说完,那就太多太多了,而且也没有这个必要,参看官方文档就能详细了解。

COMMENTS
LEAVE COMMNT