为何re.findall返回含空字符串的元组列表,而re.finditer正常工作?
问题原因与解决方案
你遇到的问题核心是re.findall的行为逻辑:当正则表达式中包含捕获组时,findall会优先返回捕获组的匹配结果,而非整个正则的匹配内容。你的正则里有两个(-)?捕获组,当这些位置没有匹配到-时,就会返回空字符串,所以最终得到的是一堆('', '')元组。而finditer返回的是Match对象,你需要调用group()或group(0)才能拿到整个匹配内容,所以看起来是正确的。
解决方法
把正则里的捕获组改成非捕获组即可,也就是将(-)?替换为(?:-)?,同时开头那个空的非捕获组(?:)可以直接删掉(完全没用)。修改后的正则如下:
_regex = re.compile(r"0\d{1,4}(?:-?\d{2,4}-?\d{2,4}|\d{8}|(?:-)?\d{2,4}(?:-)?\d{3,4})")
测试验证
运行以下代码就能得到正确的整个匹配结果列表:
import re _regex = re.compile(r"0\d{1,4}(?:-?\d{2,4}-?\d{2,4}|\d{8}|(?:-)?\d{2,4}(?:-)?\d{3,4})") _text = "06-6206-567903-3668-067403-3668-400503-3668-429503-3668-432403-3668-039206-6206-572906-6206-630303-3668-481806-6206-564403-3668-053703-3668-070606-6206-5663" result = _regex.findall(_text) print(result)
输出会是所有匹配到的完整字符串,比如:['06-6206-5679', '03-3668-0674', '03-3668-4005', ...]
补充说明
如果你确实需要保留捕获组(比如要单独提取-的位置),那可以继续用finditer,遍历每个Match对象时通过group(0)获取整个匹配,group(1)、group(2)获取捕获组内容:
for match in _regex.finditer(_text): print("完整匹配:", match.group(0)) print("第一个捕获组:", match.group(1)) print("第二个捕获组:", match.group(2))
内容的提问来源于stack exchange,提问作者Toyo
相关产品推荐
相关产品推荐

