Python phonenumber 正则表达式不够好
Posted
技术标签:
【中文标题】Python phonenumber 正则表达式不够好【英文标题】:Python phonenumber regex doesn't work good enough 【发布时间】:2012-03-31 11:38:14 【问题描述】:我在我的代码中使用了这个正则表达式代码:
pattern = re.compile('\d3,4(\/?)(\d6,6)')
m= pattern.match('0481/987421')
if m:
print "yes"
else:
print "no"
这是一个适用于以下电话号码的正则表达式:dddd/dddddddd 所以前 3 位或 4 位数字,然后是斜线与否,然后正好是 6 位数字。 它工作正常,例如 21/484135 不起作用,其他错误的事情也不起作用。 但是这个正则表达式的问题是,当我的第一个字符是正确的并且我在它后面随机输入任何内容时,它仍然会打印“是”。我的意思是这样的:0481/9874214879516874 我认为因为正则表达式匹配它返回的前 11 个字符,所以它匹配并且它后面的内容并不重要。
我该如何解决这个问题?
【问题讨论】:
我知道这似乎离题了,但是...这些是什么电话号码? 啊...\d3, 4
真的把我搞砸了。与此同时,有人发布了$
主播。你现在应该去投票了。
【参考方案1】:
我建议使用phonenumbers 模块而不是编写自己的正则表达式。以下是解析比利时电话号码的示例:
>>> x = phonenumbers.parse("0481/987421", "BE")
>>> x
PhoneNumber(country_code=32,
national_number=481987421L,
extension=None,
italian_leading_zero=False,
country_code_source=None,
preferred_domestic_carrier_code=None)
它会在无效的电话号码上抛出异常:
>>> x = phonenumbers.parse("0481/9874214879516874", "BE")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/phonenumbers/phonenumberutil.py", line 2038, in parse
"The string supplied is too long to be a phone number.")
phonenumbers.phonenumberutil.NumberParseException: (4) The string supplied is too long to be a phone number.
【讨论】:
【参考方案2】:你需要锚定你的表达。在其末尾添加$
或\Z
以确保没有任何后续内容。您还可以添加 ^
以将其锚定在字符串的开头,尽管与 match()
一起使用时不需要这样做。
pattern = re.compile(r"^\d3,4/?\d6\Z")
【讨论】:
哦不,当我现在删除斜线时它不再匹配了:/ 你使用的是同一个版本的 Python 吗? Python 使用大写\Z
(而其他使用小写 \z
),已更正。请参阅ideone 的工作示例。以上是关于Python phonenumber 正则表达式不够好的主要内容,如果未能解决你的问题,请参考以下文章
java如何判断手机号码是11为且第一位不是0且不是+86的形式