首页 > 解决方案 > 尽管负前瞻,正则表达式仍匹配字符串

问题描述

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

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

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

谢谢您的帮助!

编辑:

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

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

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

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

    return str

标签: javascriptpythonregexregex-lookarounds

解决方案


您可以使用

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

请参阅正则表达式演示

关键是您需要限制第二个\w+匹配\w+内容(因为前瞻匹配当前位置之后的文本),并且要允许匹配以 开头的单词, feat需要feat在前瞻中使用单词边界。

正则表达式详细信息

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

请参阅Python 演示

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

推荐阅读