我试图找出如何实现以下目标:
匹配整个字符串,如果其中包含单词"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
是字符串的开头和结尾。
执行前瞻时,字符串内的位置不会改变。
感谢所有回答的人
答案 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.findall
与expressions
:'hello'
和'supernova'
匹配,并检查这些匹配的长度是否等于1
。
类似的东西:
import re
def test(string):
return len(re.findall("hello", string)) == 1 and len(re.findall("supernova", string)) == 1
给出与上述相同的结果。
希望这会有所帮助:)