Python正则表达式 - 负面预测,以避免在重复单词时匹配

时间:2017-09-22 16:37:59

标签: python regex

我试图找出如何实现以下目标:

匹配整个字符串,如果其中包含单词"hello" 单词"supernova",但字符串中的都会重复。

例如:

"hello i am a supernova hello bye" NOT MATCH
"hello i am a test bye" NOT MATCH
"hello i am a supernova supernova bye" NOT MATCH
"hello i am a supernova" MATCH --> result: "hello i am a supernova"

为了解决这个问题,我从一开始就考虑了这个问题:如果我重复了同一个词,那就不匹配了。我所理解的是,一种方法是使用负面的先行,但我无法弄清楚有用的东西。

请有人给我一个提示吗?

由于

更新[已解决]

我已经解决了这个问题,并且我成功地编写了一个完整的正则表达式,可以匹配整个字符串,当且仅当至少有两个不同的单词没有重复时

\A(?!.*\b(hello|supernova)\s.*\b\1\b).*\Z

第一部分(?!.... \ b)是零长度负向前瞻(检查字符串中是否存在:.*,后跟\b字边界,跟随(hello|supernova)你好或超新星,然后是\s一个空格,然后是.*所有内容,接着是\b一个单词边界,然后是\1什么是在"组1和#34中捕获;这是在(hello OR supernova)之前的括号(...)之间包含的东西,后跟\b字边界。

如果所有这些内容都不存在,那么我可以将整个字符串与.*之前的\Z匹配。 \A\Z是字符串的开头和结尾。

执行前瞻时,字符串内的位置不会改变。

感谢所有回答的人

1 个答案:

答案 0 :(得分:1)

使用string.count()

基本上,如果字符串中True"hello"出现的次数各自等于"supernova",则您希望返回1。您可以使用.count()进行检查:

def test(string):
   return string.count("hello") == 1 and string.count("supernova") == 1

并且一些测试给出:

test("hello i am a supernova hello bye")     # --> False

test("hello i am a test bye")                # --> False

test("hello i am a supernova supernova bye") # --> False

test("hello i am a supernova")               # --> True

使用regex

如果必须使用regex,您只能re.findallexpressions'hello''supernova'匹配,并检查这些匹配的长度是否等于1

类似的东西:

import re

def test(string):
   return len(re.findall("hello", string)) == 1 and len(re.findall("supernova", string)) == 1

给出与上述相同的结果。

希望这会有所帮助:)