如何在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
相关产品推荐
相关产品推荐

