Python正则re.findall运行异常及音乐爬虫匹配艺术家失败问题排查
匹配失效的核心原因
你遇到的这个问题是正则匹配场景下的高频问题,核心诱因有三个:
- 艺术家名称包含正则元字符未转义:如果你的
ARTIST变量里包含. * + ? | ( ) [ ] { } \ ^ $这类正则保留的特殊字符,直接拼接进正则语句后,这些字符会被当成正则逻辑处理,而非普通字面字符,直接导致匹配失败。 - 横杠字符不统一:很多音乐网站为了排版美观,不会使用普通半角减号
-(Unicode编码U+002D)作为分隔符,而是会用全角破折号—、短破折号–等肉眼看起来非常相似的字符,直接硬编码匹配半角减号自然会匹配失败。 - 空白字符不可见差异:爬取到的字符串里,横杠前后的空格可能是网页常用的非断空格
(Unicode编码U+00A0)、制表符等特殊空白,和你正则里写的普通空格不匹配。
你两次测试结果不一致的原因就是第二次修改的字符串x里的分隔符或者空白和第一次不一样,这就是你原有代码中re.search、re.findall匹配失效的根因。
修复方案
修改正则构造逻辑即可:
- 用
re.escape()处理艺术家名称,自动转义所有正则特殊字符 - 用字符集兼容所有常见横杠类型,用
\s*匹配任意类型、任意数量的空白字符 - 可选添加忽略大小写标志,避免大小写不一致导致的匹配问题
修改后的代码片段如下:
# ARTIST = 示例: 'Michael Jackson' # 转义特殊字符+兼容多类型横杠和空白 regex = re.escape(ARTIST) + r'\s*[-–—]\s*' match = re.search(regex, info, flags=re.IGNORECASE)
排查技巧
后续再遇到「看起来字符一样就是匹配不上」的问题,可以直接打印字符串的字符编码对比:
# 打印前20个字符的Unicode编码,快速定位字符差异 print([ord(c) for c in info[:20]])
只要编码不一致,哪怕肉眼看起来完全一样也会匹配失败。
内容的提问来源于stack exchange,提问作者Maxjo
相关产品推荐
相关产品推荐

