正则表达式贪婪

时间:2015-05-08 13:21:05

标签: python regex

这可能是与正则表达相关的难题,但我无法解决它。这是我的正则表达式:

regex = (^|(?<= ))Football( ((\S+ )+?(?=Football)|(\S+ )+)| )fun( ((\S+ )+?(?=Football)|(\S+ )+)| )Football\ is\ important((?= )|$)

有了这个,我想抓住这些:

text1 = "Football is fun I like Football is important"
text2 = "Fun to watch Football I think Football is important"
text3 = "Fun to watch Football I like Football"

但不是这样:

text4 = "Football is fun I like Football Football is important"

据我了解,表达方式不应该匹配,因为那里还有一个足球。第二个( ((\S+ )+?(?=Football)|(\S+ )+)| )部分应该与I like匹配,因为在Football之后,它并不贪心,因为我在第二个?之后添加了+。最后一部分应该匹配Football is important,因此有一个Football(在中间)闲置。如何修改它以便它能满足我的需求?

关于这个问题的更多说明:

( ((\S+ )+?(?=Football)|(\S+ )+)| )部分应该与空白字符匹配,直到它看到足球并返回它得到的内容。所以这个正则表达式不应该与text4匹配,因为它只有两个足球。另一方面text4包含3个足球。希望现在更清楚了。

抱歉这个愚蠢的例子;我改变了我的真实文本。

1 个答案:

答案 0 :(得分:0)

第一次出现fun后,football这个词是强制性的 - 第二句和第三句无法匹配,因为那里没有fun;)

text4解释起来有点复杂。由于( ((\S+ )+?(?=Football)|(\S+ )+)| )匹配I like Football的第二次出现,它匹配。 每个单词都与内部(\S+ )+?匹配。 你是对的。你在这里使用+? - 但内部有两个机会:

  • 匹配I like (Football)
  • 匹配I like Football (Football)

两者都适用于(\S+ )+?(?=Football) - 究竟最不重要的部分是什么,只取决于下一步是什么。

实施例

将模式(\S+ )+?(?=Football)Football与文本I like Football Football一起使用。它将匹配I like Football(如您所料)。

现在,将模式修改为(\S+ )+?(?=Football)Football$。你会看到,现在,完整的文本是匹配的。如果您在第一次出现$时停止,则Football无法匹配。文本的其余部分也必须匹配 - 由于Football可以与\S+匹配,所以一切都完全有效..

希望有所帮助。