正则表达式经常被用于字符串的处理中,特别是一些使用普通处理不方便或较为复杂的环境。在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']
这些只是在我的使用中用得比较频繁的方法,真正要说完,那就太多太多了,而且也没有这个必要,参看官方文档就能详细了解。