这可能是与正则表达相关的难题,但我无法解决它。这是我的正则表达式:
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个足球。希望现在更清楚了。
抱歉这个愚蠢的例子;我改变了我的真实文本。
答案 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+
匹配,所以一切都完全有效..
希望有所帮助。