使用re.findall()获取正则完整匹配结果时异常的问题求助
问题原因与解决方法
原因
当正则表达式中包含捕获分组(即带括号的(...))时,re.findall()会优先返回每个匹配项中所有捕获分组的内容组成的元组列表,而非整个匹配的完整字符串。而re.search()返回的是Match对象,match[0](或match.group(0))对应完整匹配结果,分组内容则通过match[1]、match[2]等依次获取。
解决方法
有两种实用的解决方式:
1. 将捕获分组改为非捕获分组
把正则里的(...)替换为(?:...),这种非捕获分组仅用于实现匹配逻辑,不会被findall()单独提取,此时findall()就会返回完整的匹配字符串。
修改后的代码示例:
import re re_pattern = r"(?:\d+(?:\.\d+){2,})-(?:20\d{2})(?:\d{2})(?:\d{2})-XPTO" s = "sdfljkfslk fdjf dslkjfkfj \n | ksldfjflkj \n 1.3.6-20241129-XPTO slkj lkj | ## lkjlkjd ssss jkjkj$$=1.3.6-20241129-XPTO" matches = re.findall(re_pattern, s) print(matches)
输出:
['1.3.6-20241129-XPTO', '1.3.6-20241129-XPTO']
2. 使用re.finditer()遍历匹配对象
re.finditer()返回一个迭代器,每个元素是Match对象,通过调用group(0)即可获取每个匹配的完整内容:
代码示例:
import re re_pattern = r"(\d+(\.\d+){2,})-(20\d{2})(\d{2})(\d{2})-XPTO" s = "sdfljkfslk fdjf dslkjfkfj \n | ksldfjflkj \n 1.3.6-20241129-XPTO slkj lkj | ## lkjlkjd ssss jkjkj$$=1.3.6-20241129-XPTO" matches = [match.group(0) for match in re.finditer(re_pattern, s)] print(matches)
输出:
['1.3.6-20241129-XPTO', '1.3.6-20241129-XPTO']
内容的提问来源于stack exchange,提问作者Christian Dechery
相关产品推荐
相关产品推荐

