You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)有两个核心问题:

  1. 正向预查(?=\bFeaturing\b)是必须满足的条件,只有后面跟着Featuring的行才能匹配,其他行自然返回None
  2. [^&,]*会把Featuring本身也包含进去(因为Featuring里没有&或,),就算匹配到也不是你想要的结果

内容的提问来源于stack exchange,提问作者Ribzy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:45:50