热线电话:13121318867

登录
2018-11-27 阅读量: 1141
贪婪和非贪婪模式

重复运算符默认是贪婪的,这意味着它们将匹配尽可能多的内容。例如,假设重写了 前面的突出程序,在其中使用了如下模式:

>>> emphasis_pattern = r'\*(.+)\*'

这个模式与以星号打头和结尾的内容匹配。好像很完美,不是吗?但情况并非如此。

>>> re.sub(emphasis_pattern, r'<em>\1</em>', '*This* is *it*!')

'<em>This* is *it</em>!'

如你所见,这个模式匹配了从第一个星号到后一个星号的全部内容,其中包含另外 两个星号!这就是贪婪的意思:能匹配多少就匹配多少。 在这里,你想要的显然不是这种过度贪婪的行为。在你知道不应将某个特定的字符包 含在内时,本章前面的解决方案(使用一个匹配任何非星号字符的字符集)很好。下面再 来看另一个场景:如果使用'**something**'来表示突出呢?在这种情形下,在要强调的内 容中包含单个星号不是问题,但如何避免过度贪婪呢? 这实际上很容易,只需使用重复运算符的非贪婪版即可。对于所有的重复运算符,都 可在后面加上问号来将其指定为非贪婪的。

>>> emphasis_pattern = r'\*\*(.+?)\*\*'

>>> re.sub(emphasis_pattern, r'<em>\1</em>', '**This** is **it**!')

'<em>This</em> is <em>it</em>!'

这里使用的是运算符+?而不是+。这意味着与以前一样,这个模式将匹配一个或多个通配 符,但匹配尽可能少的内容,因为它是非贪婪的。因此,这个模式只匹配到下一个'\*\*', 即它末尾的内容。如你所见,效果很好

0.0000
5
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子