修复find_all_phones函数正则表达式以匹配乌克兰国际格式手机号
修复乌克兰国际格式电话号码的正则表达式问题
原函数的正则表达式仅匹配了号码的前半段,导致结果截断,无法完整捕获符合要求的17位乌克兰国际格式电话号码。
问题分析
给定的乌克兰电话号码规则:
- 必须以
+开头,格式为+380(XX)XXX-X-XXX或+380(XX)XXX-XX-XX - 总长度固定为17字符
- 仅包含数字、
+、(、)、-符号
原正则r"(\+380\(\d{2}\)\d{3}-\d{1,2})"只匹配到+380(XX)XXX-X或+380(XX)XXX-XX部分,遗漏了后续的-XXX或-XX段,因此无法完整捕获目标号码。
修正后的代码
import re def find_all_phones(text): # 匹配两种合法格式:+380(XX)XXX-X-XXX 或 +380(XX)XXX-XX-XX,确保总长度17字符 result = re.findall(r"\+380\(\d{2}\)\d{3}-(?:\d{1}-\d{3}|\d{2}-\d{2})", text) return result
正则解释
\+380:匹配号码开头的国际区号前缀\(\d{2}\):匹配两位数字的区号,用英文括号包裹\d{3}:匹配区号后的三位数字-:匹配第一个分隔横杠(?:\d{1}-\d{3}|\d{2}-\d{2}):非捕获组,同时匹配两种合法的后缀格式:\d{1}-\d{3}:1位数字+横杠+3位数字\d{2}-\d{2}:2位数字+横杠+2位数字
这两种组合刚好让整个号码长度达到17字符,符合规则要求。
测试验证
传入示例文本:
Irma +380(67)777-7-771 second +380(67)777-77-77 aloha a@test.com abc111@test.com.net +380(67)111 -777-777+380(67)777-77-787
修正后的函数返回:
['+380(67)777-7-771', '+380(67)777-77-77', '+380(67)777-77-78']
与预期结果一致。
内容的提问来源于stack exchange,提问作者Alduin
相关产品推荐
相关产品推荐

