DataFrame列含特殊字符文件名的子字符串匹配失败求助
问题分析与解决方案
问题根源
你遇到的匹配失败和警告,核心原因是pandas.Series.str.contains()的默认行为:它会把传入的字符串当作正则表达式解析。
- 对于
birads - 2 (11).bmp,其中的(11)是正则的分组语法,.是匹配任意字符的通配符,这些特殊字符导致实际匹配逻辑偏离了你想要的"字面字符串包含",所以找不到对应行,同时触发正则分组的警告。 - 而
case001.png里没有正则特殊字符,所以能正常匹配。
解决方案
方案1:直接使用字面量匹配(推荐)
给str.contains()添加regex=False参数,强制按字面内容检查子串匹配,完全规避正则解析的问题:
actual = df.loc[df['Image_filename'].str.contains(str1, regex=False), 'BIRADS'].values[0]
方案2:转义正则特殊字符(不推荐,冗余)
如果一定要保留正则模式,可以先用re.escape()转义所有特殊字符:
import re escaped_str = re.escape(str1) actual = df.loc[df['Image_filename'].str.contains(escaped_str), 'BIRADS'].values[0]
额外优化:避免索引错误
如果存在找不到匹配行的情况,values[0]会抛出IndexError,可以增加空值判断:
match_rows = df[df['Image_filename'].str.contains(str1, regex=False)] if not match_rows.empty: actual = match_rows['BIRADS'].iloc[0] else: actual = None # 或根据需求处理无匹配的场景
内容的提问来源于stack exchange,提问作者Hrishi Chougule
相关产品推荐
相关产品推荐

