REGEX正则表达式如何递归捕获分组,提取全部匹配的文件名?
正则匹配多文件名调整方案
问题原因
原有正则使用贪婪匹配规则,false.+"name":")中的.+会尽可能匹配最长的符合规则的字符串,会从第一个false位置一直向后匹配到最后一个文件名的前缀位置,因此最终只能捕获到最后一个符合后缀要求的文件名。
调整后的正则方案
正则表达式
如果需要限定仅匹配dir为false的条目,使用:"dir":"false",[^}]*?"name":"([^"]+\.(?:jpg|jpeg|png))"
如果不需要限定dir属性,仅提取所有图片文件名,使用:"name":"([^"]+\.(?:jpg|jpeg|png))"
关键修改点
- 把贪婪匹配的
.+替换为非贪婪的[^}]*?,匹配范围被限制在单个JSON对象内部,不会跨对象匹配 - 使用
[^"]+匹配文件名,避免匹配到文件名外的其他内容 - 后缀规则使用非捕获组
(?:jpg|jpeg|png),避免额外捕获后缀内容
全局匹配要求
除了正则本身调整外,需要开启正则的全局匹配模式才能返回所有匹配结果:
- JavaScript/Java等语言:正则末尾加
g修饰符 - Python:使用
re.findall()或re.finditer()方法 - PHP:使用
preg_match_all()函数
代码示例(Python)
import re # 原始数据 raw_data = '''{"dir":"false", "bytes":158481, "parent_folder":"/Annie/FROM OLD DVDS", "name":"1.jpg"}, {"dir":"false", "bytes":382661, "parent_folder":"/Annie/FROM OLD DVDS", "name":"2.jpg"}, {"dir":"false", "bytes":1455205, "parent_folder":"/Annie/FROM OLD DVDS", "name":"3.jpg"}''' # 匹配规则 pattern = r'"dir":"false",[^}]*?"name":"([^"]+\.(?:jpg|jpeg|png))"' # 全局匹配所有结果 file_names = re.findall(pattern, raw_data) # 按要求格式输出 print(', '.join(file_names))
运行后输出:1.jpg, 2.jpg, 3.jpg
内容的提问来源于stack exchange,提问作者Ruri Rocks
相关产品推荐
相关产品推荐

