正则表达式匹配字符串尽管负前瞻

regex matches string despite negative lookahead

我想匹配一个字符串中的前两个词,除非第二个是“feat”,那么我只想匹配第一个词。

我的计划: (\w+(?: \w+))(?!feat) 不起作用。 “壮举”每次都会匹配。我尝试了相同的变体,但无济于事。

这是一个示例字符串:“Technotronic feat Ya Kid K”

感谢您的帮助!

编辑:

这是它翻转的字符串: “Technotronic 壮举 Ya Kid K”

这是应该剪切字符串的代码:

pattern = re.compile("^\w+(?: (?!feat\b)\w+)?")

def cut(string):
    str = pattern.search(string).group(0)

    return str

您可以使用

\w+(?: (?!feat\b)\w+)?
\w+(?:\s+(?!feat\b)\w+)?

参见regex demo

关键是你需要限制第二个 \w+ 匹配 就在 \w+ 之前(因为先行匹配紧跟在当前位置),并允许匹配单词 feat 开头,您需要在前瞻中 feat 之后使用单词边界。

正则表达式详细信息:

  • \w+ - 一个或多个单词字符
  • (?:\s+(?!feat\b)\w+)? - 一个可选的非捕获组:
    • \s+ - 零个或多个空格
    • (?!feat\b) - 紧靠右边,不能有一个完整的单词 feat(因此,后续的 \w+ 不会匹配 feat 但会匹配 feature)
  • \w+ - 一个或多个单词字符。

参见 Python demo:

import re
pattern = re.compile(r"^\w+(?: (?!feat\b)\w+)?")

def cut(text):
    m = pattern.search(text)
    if m:
        return m.group(0)
    return string

print(cut("Technotronic feat Ya Kid K"))    # => Technotronic
print(cut("Technotronic feature Ya Kid K")) # => Technotronic feature