【发布时间】:2011-03-29 22:08:05
【问题描述】:
Dive into python 提供了一个关于为电话号码创建正则表达式的精彩小教程:http://diveintopython3.ep.io/regular-expressions.html#phonenumbers
最终版本看起来像:
phone_re = re.compile(r'(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$', re.VERBOSE)
这适用于我能想到的几乎所有示例,但是我发现了一个我似乎无法修复的非常大的故障。
如果电话号码前有一组 3 位数字,则可以正常工作。 IE: “500 美元折扣,请致电 123-456-7891”
如果电话号码后面出现一组 3 位数字,则失败。 IE: “拨打 123-456-7891 可享受高达 500 的折扣”
对两个示例都适用的修复有什么想法吗?
【问题讨论】:
-
我总是惊讶于网络社区中受人尊敬的人们如何全心全意地提供有缺陷的(即以美国为中心的)建议。这可能是一个很好的学术示例,可以为初学者提供实用的正则表达式,但您不应该在实际应用程序中使用它。电话号码在世界各地都不尽相同。
-
甚至没有,因为不是每个人都可以像他们应该的那样格式化电话号码。
-
@Amber:“从不打算在美国以外的任何地方使用您的应用程序。”这就是为什么这么多应用程序仍然无法处理 US-ASCII 范围之外的字符的原因。这是我们最终应该克服的上个世纪的思维定势。
-
在为 Dive into Python 辩护时,作者明确表示他正在解析美国电话号码,并列出了电话号码可能出现的格式。
-
这种现象也是为什么短视的程序员坚持人名中不能有标点符号,即使撇号、句号、连字符和空格都很常见足够的。 (我什至不会开始使用不适合 ASCII 的名称。)
标签: python regex phone-number