Python正则表达式文件名前后通配符搜索报错求助
解决文件名任意位置字符串匹配的问题
报错原因
你遇到的re.error: nothing to repeat at position 0是因为正则表达式中的*是量词,必须跟在某个字符、分组或字符类之后(比如a*表示匹配0个或多个a),直接以*开头的正则没有可重复的前置元素,因此触发语法错误。
你之前的代码redeemed = redeemed + "*"能运行是因为前面有具体字符串,但这其实不是正确的通配符用法——它只会让正则匹配redeemed末尾字符的重复(比如输入File A会生成File A*,实际匹配File A、File AA等,而非包含File A的任意文件名)。
正确实现方案
你的需求是匹配包含指定字符串的任意文件名(目标字符串出现在文件名任意位置即可),有两种简单可靠的实现方式:
方法1:用fnmatch实现通配符匹配(推荐)
fnmatch是Python内置模块,专门处理shell风格的通配符,完全符合你对*作为通配符的预期:
import fnmatch # 构建通配符模式:前后加*表示任意位置包含目标字符串 match_pattern = f"*{redeemed}*" # 筛选匹配的文件名 results = [file for file in sounds if fnmatch.fnmatch(file, match_pattern)]
这个方法不需要处理特殊字符,*直接代表任意长度的任意字符,逻辑直观,不会有正则语法的坑。
方法2:用正则表达式实现
如果需要更复杂的匹配逻辑(比如带正则语法的模糊搜索),可以用re模块,但需要先转义输入字符串避免正则特殊字符干扰:
import re # 转义输入字符串,处理.、+、?等正则特殊字符 escaped_keyword = re.escape(redeemed) # re.search会自动在整个文件名中查找匹配的子串,无需额外加通配符 results = [file for file in sounds if re.search(escaped_keyword, file)]
注:如果一定要手动模拟通配符,也可以写pattern = f".*{escaped_keyword}.*",但re.search本身已支持任意位置匹配,这步是多余的。
内容的提问来源于stack exchange,提问作者AppropriatePanic
相关产品推荐
相关产品推荐

