Python正则提取澳大利亚电话号码仅返回开头片段问题求解
匹配结果不符合预期的原因
- 触发了
re.findall的默认返回逻辑:如果正则中存在未标记为非捕获的圆括号分组,函数不会返回整个匹配的完整字符串,只会返回每个匹配对应分组捕获到的内容。你当前的正则把号码前缀(0|\+61|61)写为普通捕获组,因此最终结果仅会显示该分组抓取到的前缀值,而非完整号码。 - 细节问题导致匹配不全:一是正则中匹配字面
+符号时遗漏转义,直接漏过了+61开头的号码,才会出现只返回['0', '61']的结果;二是代码中定义的待匹配字符串变量名为txt,但调用re.findall时传入了未定义的text变量,实际运行时会直接触发变量名报错。
正确实现方式
- 把原有捕获分组改造为非捕获分组:在圆括号开头加上
?:,让括号仅承担多分支匹配的作用,不产生额外的捕获记录,此时re.findall会直接返回完整的匹配结果。 - 修正变量名、特殊字符转义的问题,可直接运行的代码如下:
import re txt = "My phone number is 0412345677 or +61412345677 or 61412345677" # 分支顺序将更长的前缀放前面,避免回溯错位 find_ph = re.findall(r'(?:\+61|61|0)[234578]\d{8}', txt)
- 执行上述代码即可得到目标结果:
['0412345677', '+61412345677', '61412345677']
补充:如果场景中需要保留捕获组提取特定部分的内容,也可以改用
re.finditer方法遍历匹配对象,通过匹配对象的group()方法获取全量匹配的字符串,不必强制修改分组类型。
内容的提问来源于stack exchange,提问作者VeilEclipse
相关产品推荐
相关产品推荐

