使用正则表达式以多种方式匹配相同的字符串

时间:2014-07-09 16:31:14

标签: python regex

我有以下代码:

import re

pattern = re.compile('^(.+)\'s (.+)$',re.I)

string = "bill's uncle's pony"

matchObjects = pattern.finditer(string)

for i in matchObjects:
    if i:
        print i.group(1)
        print i.group(2)

这会产生输出:

bill's uncle
pony

当我希望它会产生输出

bill's uncle
pony
bill
uncle's pony

也就是说,我想要字符串匹配的所有方式。这段代码只给了我一个。任何想法都非常赞赏。

2 个答案:

答案 0 :(得分:1)

  

"也就是说,我想要字符串匹配的所有方式。这段代码只给我一个。"

那不是真的。它为您提供了仅使用 方式的正则表达式与您的输入匹配。这是greedy +量词所做的事情:它跳过除最后一个之外的所有可能性 - 只要仍然可以进行匹配。

因此,您永远不会只使用当前的正则表达式uncle's

也许你可以做两次,首先是当前贪婪的正则表达式

^(.+)\'s (.+)$

Regular expression visualization

Debuggex Demo

然后再次使用reluctant版本:

^(.+?)\'s (.+)$

Regular expression visualization

Debuggex Demo

贪婪匹配bill's unclepony。不情愿的匹配billuncle's pony

但是"找到所有匹配的概念"没有意义。正则表达式以完全一种方式匹配或不匹配输入字符串。

(我对debuggex图像完全相同感到惊讶。)


请考虑将Stack Overflow Regular Expressions FAQ加入书签以供将来参考。

答案 1 :(得分:-1)

之前建议DOTALL,但这并不好。尝试使用非贪婪修饰符“?”

pattern = re.compile('^(.+?)\'s (.+?)$',re.I)

仍然没有给予exactley所需的输出,但也许它会帮助我们走上正轨。

输出:

bill
uncle's pony