如何用正则表达式提取两种文件路径中的文件名‘file’?
从两种路径字符串中提取文件名核心部分
我有以下两个字符串:
txt = '/path/to/photo/file.jpg' txt = '/path/to/photo/file_crXXX.jpg'
其中第二个字符串里的XXX是任意长度的变量内容,需要从这两个路径中提取名称file。
我尝试了以下两段单独的正则代码,分别对两种路径有效:
re.search(".*/(.*)\.jpg", txt).group(1) re.search(".*/(.*)_cr.*", txt).group(1)
但合并成一个正则表达式时,下面的写法无法正常工作:
re.search(".*/(.*)(_cr.*)|(\.jpg)*", txt).group(1) re.search(".*/(.*)(\.jpg)|(_cr.*)", txt).group(1)
请问该如何正确实现?
正确实现方案
正则表达式方案
可以通过可选分支+非捕获组来统一匹配两种路径,确保捕获组稳定获取目标内容:
import re # 测试两种路径示例 paths = [ '/path/to/photo/file.jpg', '/path/to/photo/file_crXXX.jpg' ] # 核心正则:匹配路径末尾的目标名称,忽略两种后缀 pattern = r".*/(.*?)(?:_cr.*|\.jpg)" for path in paths: result = re.search(pattern, path).group(1) print(result) # 两次输出均为 'file'
正则说明:
.*?:非贪婪匹配,确保只捕获到_cr或.jpg之前的内容,避免过度匹配到无关字符(?:...):非捕获组,用来包裹两种后缀分支,不会生成额外捕获组干扰结果_cr.*|\.jpg:匹配两种结尾情况,要么是_cr开头的任意内容,要么是.jpg后缀
非正则方案(更直观)
如果不想用正则,也可以借助路径处理工具分割后再提取:
import os for path in paths: # 获取路径中的文件名部分(带后缀) filename = os.path.basename(path) # 按两种后缀分割取前半部分 if '_cr' in filename: core_name = filename.split('_cr')[0] else: core_name = filename.split('.jpg')[0] print(core_name) # 两次输出均为 'file'
原写法失效原因
之前的正则把捕获组和分支的逻辑结构搞错了:
- 原表达式中
.*是贪婪匹配,会优先匹配到字符串末尾,导致捕获组内容不符合预期 - 分支的层级错误,没有把两种后缀放在同一匹配分支里,导致捕获组无法稳定获取目标内容
内容的提问来源于stack exchange,提问作者Tlaloc-ES
相关产品推荐
相关产品推荐

