【问题标题】:International phone number validation国际电话号码验证
【发布时间】:2012-01-14 11:01:49
【问题描述】:

我需要在 Python 中对所有美国和国际电话号码进行非常基本的电话号码验证和格式化。到目前为止,这是我所拥有的:

import re 

def validate(number):
    number = re.compile(r'[^0-9]').sub('', number)
    if len(number) == 10:
        # ten-digit number, great
        return number
    elif len(number) == 7:
        # 7-digit number, should include area code
        raise ValidationError("INCLUDE YOUR AREA CODE OR ELSE.")
    else:
        # I have no clue what to do here

def format(number):
    if len(number) == 10:
        # basically return XXX-XXX-XXXX
        return re.compile(r'^(\d{3})(\d{3})(\d{4})$').sub('$1-$2-$3', number)
    else:
        # basically return +XXX-XXX-XXX-XXXX
        return re.compile(r'^(\d+)(\d{3})(\d{3})(\d{4})$').sub('+$1-$2-$3-$4', number)

我的主要问题是我不知道国际电话号码是如何工作的。我假设它们只是 10 位数字,前面有国家代码的 \d+。这是真的?

【问题讨论】:

  • @TK Kocheran:关于 SO 的其他问题是否满足您的需求。在这种情况下,您可以删除此问题。
  • 我认为事情不会这么简单。看看this page,我发现有几个国家不适合 10 位格式,尽管它很常见。您还必须担心无效的 10 位数字。例如,号码 555.XXX.XXXX 在美国无效。 911.XXX.XXXX 也是如此。这些因国家/地区而异。
  • Here's Google 手机库的 Python 端口。也许你可以使用它。
  • 国际电话号码可以有任意长度。在德国,供应商会为同一城市的客户提供不同长度的数字。如果我的提供商将拨打的号码传输给我,我什至可以通过在分配的号码上附加更多数字来创建新号码,并为它们配置我自己的 pbx。

标签: python validation


【解决方案1】:

E.164 数字最多可达 15 位数字,您不应期望超出 1-3 位数字的国家/地区代码,它们将适合任何特定形式。当然有很多国家不是XXX-XXX-XXXX。在我看来,您有三个选择:

  1. 精心创建每个国家代码的数字格式数据库。然后定期检查每个国家/地区的更新。 (编辑:它看起来像 Google already does this,所以如果您信任他们和 Python 搬运工来保持 libphonenumber 正确和最新,并且不介意每次发生更改时都升级这个库,那可能对您有用。 )
  2. 删除提供的电话号码中的所有分隔符并将其格式化,不带任何空格:+12128675309
  3. 按照用户提供的数字格式化数字,而不是自己错误地重新格式化。

【讨论】:

【解决方案2】:

我忽略了空格和破折号在哪里的格式。 但这里是我用来验证数字的正则表达式函数:

  • 最后,国家代码以 + 和一些数字开头
  • 最后,包含一组括号,其中包含用于区号或可选 0 的数字
  • 以数字结尾
  • 号码本身包含空格或破折号(不在国家或地区代码中):
def is_valid_phone(phone):
    return re.match(r'(\+[0-9]+\s*)?(\([0-9]+\))?[\s0-9\-]+[0-9]+', phone)

【讨论】:

  • is_valid_phone('43b') 将返回 True
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2010-09-15
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多