Python 如果前面没有否定词,则Regex包含单词

Python 如果前面没有否定词,则Regex包含单词,python,regex,Python,Regex,我想抓住那些说“好”或“好”的短语,但不要被前面的“不”或“不是”否定 sents= ["good words", # Words after phrase "not good words", "isn't good words", "great words", "not great words"

我想抓住那些说“好”或“好”的短语,但不要被前面的“不”或“不是”否定

sents= ["good words",                   # Words after phrase
        "not good words",
        "isn't good words",

        "great words",
        "not great words",
        "isn't great words",



        "words good",                   # Words before phrase
        "words not good",
        "words isn't good"

        "words great",
        "words not great",
        "words isn't great"


        
        "words good words",             # Words before and after phrase
        "words not good words",
        "words isn't good words",

        "words great words",
        "words not great words",
        "words isn't great words",
]
我想回去

good words
words good
words good words

great words
words great
words great words

什么是正则表达式可以让我这样做?从理论上讲,我希望能够有一个单词列表,只有当字符串前面不包含否定词列表中的任何单词时,才能找到该列表。

您需要使用向后看,在这种情况下,否定词,因为肯定词也有一个版本。您可以简单地使用它:

(?<!not\s)great

在python中,您可以将此正则表达式与两个负查找断言一起使用:

(?<!isn't )(?<!not )\b(?:good|great)\b
(?<!isn't )(?<!not )\b(?:good|great)\b
>>> sents= ["good words",                   # Words after phrase
...         "not good words",
...         "isn't good words",
...         "great words",
...         "not great words",
...         "isn't great words",
...         "words good",                   # Words before phrase
...         "words not good",
...         "words isn't good",
...         "words great",
...         "words not great",
...         "words isn't great",
...         "words good words",             # Words before and after phrase
...         "words not good words",
...         "words isn't good words",
...         "words great words",
...         "words not great words",
...         "words isn't great words",
... ]
>>> reg = re.compile(r"(?<!isn't )(?<!not )\b(?:good|great)\b")
>>> for s in sents:
...     if reg.search(s):
...             print(s)
...
good words
great words
words good
words great
words good words
words great words