原文在此
我的一个同事说他怀念Ruby的正则表达式语法糖。我没有用过Ruby的正则表达式,但是我熟悉Python的,并且知道它的API需要一些语法糖来弥补一下。
首先,从正则表达式中获取分组需要2步。第一步,调用match()或者search(),并且将结果付值给一个变量。然后,需要检察结果是否为None(表示是否有找到匹配)。最后,如果匹配确实存在,你可以安全地取出分组。下面是一个例子:
>>> import re
>>> match_obj = re.match('([0-9]+)', '123foo')
>>> match_obj # What is `match_obj`?
<_sre.SRE_Match object at 0x7fd1bb000828>
>>> match_obj.groups()('123',)
>>> match_obj = re.match('([0-9]+)', 'abc')
>>> match_objNone
依我来看,如果能像下面这样就更好了:
>>> re.get_matches('([0-9]+)', '123foo')('123',)
>>> re.get_matches('([0-9]+)', 'abc')None
另一个我常遇到的问题是弄混re.sub的参数,re.sub是用来查找和替换用的。所需要的参数按照顺序依次是模式(pattern),替换(replacement),还有字符串。由于更重各样的原因,对我来说search_string放在replacement前面看着更起来更直接。
不幸的是,弄混这些参数将会导致看上去正确的结果。下面是个例子,为了把单词foo用bar来代替。
>>> re.sub('foo', 'replace foo with bar', 'bar')
'bar'
>>> re.sub('foo', 'bar', 'replace foo with bar')
'replace bar with bar'
在上面例子中,有时我们会推测输入的字符串仅仅是foo