正则表达式匹配字符串尽管负前瞻
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
我想匹配一个字符串中的前两个词,除非第二个是“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