【问题标题】:Phone Number Regular Expression (Regex) in PythonPython中的电话号码正则表达式(Regex)
【发布时间】: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


【解决方案1】:

(\d*)$ 要求您匹配的字符串以数字字符结尾($ 表示“行尾”)。如果您要匹配电话号码可能不在行尾的较大字符串,请尝试删除 $

【讨论】:

    【解决方案2】:

    这是您的原件,带有一些空格(使用 re.VERBOSE,或删除空格):

    (\d{3}) \D* (\d{3}) \D* (\d{4}) \D* (\d*)
    

    \D* 将匹配非数字的任何内容,包括单词。也许你应该试试这个:

    (\d{3}) \W* (\d{3}) \W* (\d{4}) \W* (\d*)
    

    \W* 匹配任何不是单词的内容。它将匹配(222) - 222 - 2222。但是,如果数字之间有字母,则不会匹配,如(222) x 222 - 2222。比赛的最后一部分(\d*) 似乎正在寻找扩展名。这些可以通过多种方式格式化——我建议你要么放弃它,要么根据你期望数据的外观来优化它。而且,就像 Amber 说的,你应该放弃$

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2017-09-23
      • 2014-02-15
      • 2020-01-18
      • 1970-01-01
      相关资源
      最近更新 更多