You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式提取两种文件路径中的文件名‘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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:29:09