如何在DataFrame中精准匹配不含扩展名的目标文件名?
解决方案:精确匹配不带扩展名的文件名
你的问题在于str.contains()是包含匹配,只要字符串里有目标子串就会被选中,所以才会误匹配到xyz123.pdf这类文件名。下面是几种可靠的精确匹配方法:
方法1:提取文件名主体后精确匹配
最直观的方式是先从文件名中剥离扩展名,再和目标文件名做精确相等判断。考虑到文件名可能包含多个点(比如report.v2.pdf),我们用rsplit('.', 1)从最后一个点拆分,确保拿到完整的文件名主体:
import pandas as pd # 示例数据 df = pd.DataFrame({'A': ['xyz.pdf', 'xyz123.pdf', 'abc.xyz.pdf', 'xyz.txt']}) fileName = 'xyz' # 提取最后一个点之前的部分,然后精确匹配 result = df[df['A'].str.rsplit('.', 1).str[0] == fileName] print(result)
输出结果会只包含xyz.pdf和xyz.txt,完美避开xyz123.pdf和abc.xyz.pdf。
方法2:用正则表达式做完整匹配
如果需要更灵活的匹配逻辑(比如文件名包含特殊字符),可以用正则表达式确保开头就是目标文件名,紧接着是扩展名的分隔点:
import re # 用re.escape处理文件名中的特殊字符(比如如果fileName是"abc.def") pattern = re.compile(f'^{re.escape(fileName)}\\.') result = df[df['A'].str.match(pattern, na=False)]
这里^表示字符串开头,\\.匹配实际的点(正则中点是通配符,需要转义),re.escape()能自动处理文件名里的正则特殊字符,避免匹配出错。
方法3:用fullmatch匹配完整字符串
如果你想强制匹配整个文件名格式为「目标名.扩展名」,可以用str.fullmatch(),它要求整个字符串完全符合正则模式:
result = df[df['A'].str.fullmatch(f'{fileName}\\..+')]
..+表示点后面至少有一个字符(确保有扩展名),这样连不带扩展名的xyz也会被排除(如果你的列里有这类数据的话)。
内容的提问来源于stack exchange,提问作者dmornad
相关产品推荐
相关产品推荐

