检查电话号码的正则表达式不工作



我正在尝试使用正则表达式来检查电话号码。下面是我使用的代码:

phnum ='1-234-567-8901'
pattern =  re.search('^+?d{0,3}s?(?d{3})?[-.s]?d{3}[-.s]?d{4}$',phnum,re.IGNORECASE)
print(pattern)

即使对于简单的数字,它似乎也不起作用。谁能纠正我哪里错了?

这是一个可能的解决方案。我不擅长正则表达式,所以我可能遗漏了一些东西。

import re
phone_pattern = re.compile(r"^(+?d{0,2}-)?(d{3})-(d{3})-(d{4})$")
phone_numbers = ["123-345-6134",
"1-234-567-8910",
"+01-235-235-2356",
"123-123-123-123",
"1-asd-512-1232",
"a-125-125-1255",
"234-6721"]
for num in phone_numbers:
print(phone_pattern.findall(num))

输出:

[('', '123', '345', '6134')]
[('1-', '234', '567', '8910')]
[('+01-', '235', '235', '2356')]
[]
[]
[]
[]

直接的问题是您在最后两个d:s之前丢失了。此外,第一个s显然不匹配破折号。

我也强烈建议所有正则表达式使用r'...'原始字符串,以避免Python的字符串解析器在到达正则表达式引擎之前计算一些反斜杠序列。

phnum ='1-234-567-8901'
pattern = re.search(
r'^+?d{0,3}[-.s]?(?d{3})?[-.s]?d{3}[-.s]?d{4}$',
phnum, re.IGNORECASE)
print(pattern)

演示:https://ideone.com/EYtTKZ

更根本的是,也许你应该只接受右括号,如果它前面有一个左括号,等等。一种常见的方法是在尝试将数字序列用作电话号码之前对它们进行规范化,但这有点像鸡和蛋的问题。(例如,您不希望在大数字或IP地址上得到误报。)

最新更新