Python正则表达式:提取到&、,或Featuring前的内容
解决正则匹配终止符包含单词的问题
嘿,我完全懂你纠结这么久的感受!原来的正则只能处理&和,单个字符的终止符,但要把Featuring这个单词也作为停止标记,直接用排除集根本行不通——因为排除集只能针对单个字符,没法识别一整个单词。而且你之前尝试的正向预查写法太“强硬”了,它要求后面必须跟着Featuring,所以没有这个单词的行自然就匹配不到了。
正确的正则表达式
直接用这个模式就能完美满足你的需求:
pattern = re.compile(r"^.*?(?=\s+Featuring\b|&|,|$)")
拆解一下逻辑
咱们一步步看这个正则的作用:
^:锚定到每行的开头,避免匹配字符串中间的内容.*?:非贪婪匹配任意字符,这里的“非贪婪”是关键——它会尽可能少地匹配,直到遇到后面的终止条件就立刻停下(?=\s+Featuring\b|&|,|$):正向预查(零宽断言),用来判断当前位置后面是否是以下几种情况之一:\s+Featuring\b:一个或多个空格+完整的Featuring单词(\b是单词边界,避免匹配类似Featuringxyz这种变体)&:直接遇到&符号,:直接遇到逗号$:行的结尾(专门处理像Drake这种没有任何终止符的情况)
测试验证
把你的测试字符串代入,就能得到你想要的结果:
- 输入
Drake→ 匹配Drake(行尾触发终止) - 输入
Post Malone Featuring Ty Dolla $ign→ 匹配Post Malone(遇到Featuring前的空格触发终止) - 输入
BlocBoy JB Featuring Drake→ 匹配BlocBoy JB - 输入
Offset & Metro Boomin→ 匹配Offset(遇到&触发终止) - 输入
Jay Rock, Kendrick Lamar, Future & James Blake→ 匹配Jay Rock(遇到第一个逗号触发终止)
完整Python代码示例
import re pattern = re.compile(r"^.*?(?=\s+Featuring\b|&|,|$)") test_artists = [ "Drake", "Post Malone Featuring Ty Dolla $ign", "BlocBoy JB Featuring Drake", "Offset & Metro Boomin", "Jay Rock, Kendrick Lamar, Future & James Blake" ] for artist in test_artists: match_result = pattern.match(artist) if match_result: print(match_result.group().strip()) # strip是为了保险,避免偶尔出现的 trailing 空格
为什么之前的写法不行?
你之前用的^[^&,]*(?=\bFeaturing\b)有两个核心问题:
- 正向预查
(?=\bFeaturing\b)是必须满足的条件,只有后面跟着Featuring的行才能匹配,其他行自然返回None [^&,]*会把Featuring本身也包含进去(因为Featuring里没有&或,),就算匹配到也不是你想要的结果
内容的提问来源于stack exchange,提问作者Ribzy
相关产品推荐
相关产品推荐

