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

如何在Python中用正则表达式提取含固定+动态字符的指定字符串

提取指定格式文件名的正则方案

问题背景

给定日志内容:

33f04e43cc6","from":"/ABC001/data/ZZZ000_logger_v1_20221010053935242_1.zip","to":"/ABC001/data/ZZZ000_logger_v1_20221010053935242_1.zip","remove":true,"objectId":"229bea5a-c9b0-4ad0-aecc-84a63bc7dc6f"}2022-10-10
05:39:35,247 Platform.Interface: Published message to topic:
{"id":"a32e6cbe-94d4-493f-ae56-933f04e43cc6"},
"from":"/ABC001/data/ZZZ000_single_3445442_1.zip"

需要提取符合以下固定格式的文件名:

  • [任意字母数字]_logger_v1_[任意数字]_1.zip
  • [任意字母数字]_single_[任意数字]_1.zip

原尝试的正则表达式 ^\W.*zip$ 仅返回完整文件路径,无法精准匹配目标文件名,同时需要对提取结果去重。

解决方案

1. 构造精准匹配的正则表达式

针对目标文件名的固定格式,构造如下正则:

pattern = r'\w+_(?:logger_v1|single)_\d+_1\.zip'

各部分含义:

  • \w+:匹配任意长度的字母数字组合(对应格式中的「AnyAlphanumericCharacter」)
  • (?:logger_v1|single):非捕获分组,匹配固定字符串logger_v1或single
  • \d+:匹配任意长度的数字(对应格式中的「AnyNumeric」)
  • _1\.zip:匹配固定后缀,.需转义避免匹配任意字符

2. 提取并去重

使用re.findall提取所有匹配项,再通过集合实现去重:

import re

# 日志字符串
log_content = """33f04e43cc6","from":"/ABC001/data/ZZZ000_logger_v1_20221010053935242_1.zip","to":"/ABC001/data/ZZZ000_logger_v1_20221010053935242_1.zip","remove":true,"objectId":"229bea5a-c9b0-4ad0-aecc-84a63bc7dc6f"}2022-10-10
05:39:35,247 Platform.Interface:  Published message to topic:
{"id":"a32e6cbe-94d4-493f-ae56-933f04e43cc6"},
"from":"/ABC001/data/ZZZ000_single_3445442_1.zip"""

# 提取所有匹配的文件名
file_matches = re.findall(r'\w+_(?:logger_v1|single)_\d+_1\.zip', log_content)
# 去重
unique_files = list(set(file_matches))

print(unique_files)

运行结果:

['ZZZ000_logger_v1_20221010053935242_1.zip', 'ZZZ000_single_3445442_1.zip']

原正则问题说明

原表达式 ^\W.*zip$ 的问题:

  • ^ 和 $ 锚定了整个字符串的开头和结尾,只会匹配从非单词字符开始到zip结尾的整段内容(即完整路径)
  • .* 是贪婪匹配,会覆盖过多无关内容,无法精准定位文件名部分

内容的提问来源于stack exchange,提问作者KBNanda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:40:38