国际电话号码验证

5

我需要在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+。这是真的吗?


1
可能是 电话号码验证的全面正则表达式 的重复。 - mac
@TK Kocheran:另一个SO上的问题是否回答了您的需求。如果是这种情况,您可以删除此问题。 - pyfunc
我认为事情不会这么简单。仅仅看一下这个页面就可以发现,即使是非常普遍的10位数字格式,也有几个国家不适用。你还需要担心无效的10位数字。例如,在美国,号码555.XXX.XXXX和911.XXX.XXXX都是无效的。这些情况在每个国家都会有所不同。 - Kris Harper
这里有 Google 电话库的 Python 移植版。也许你可以使用它。 - jan zegan
1
国际电话号码可以有任意长度。在德国,即使是同一城市的客户,供应商也会提供不同长度的号码。如果我的供应商向我传输拨打的号码,我甚至可以通过将更多数字添加到我的分配号码并为它们配置自己的 PBX 来创建新号码。 - johannes
@Naftuli,你使用过python-phonenumbers吗?你的体验如何?你推荐它吗?还有另一个Python包-phonenumbers,你觉得这两个怎么比较? - Pankaj Singhal
2个回答

8

E.164号码最多可以达到15位数字,除了1-3位的国家代码外,您不应该期望它们符合任何特定形式。当然,有许多国家的格式不是XXX-XXX-XXXX。我认为你有三个选择:

  1. 费力地创建每个国家代码的号码格式数据库。然后定期检查每个国家是否有更新。(编辑:看起来谷歌已经做到了这一点,所以如果您信任他们和Python porter保持libphonenumber的正确性和最新性,并且不介意在更改时升级此库,那么这可能适合您。)
  2. 消除所提供电话号码中的所有分隔符,并将它们格式化为没有任何间隔的形式:+12128675309
  3. 按照用户提供的方式格式化号码,而不是自己错误地重新格式化。

你推荐使用 python port 吗?还有另一个 Python 包 - phonenumbers,你觉得这两个怎么比较? - Pankaj Singhal

3

我不考虑空格和破折号的格式。

这是我用来验证数字的正则表达式函数:

  • 必须以国家代码的“+”和一些数字开头
  • 可能包含一个括号,里面是区号或可选的0
  • 以数字结尾
  • 号码本身中可能包含空格或短横线(不在国家或区域代码中):
def is_valid_phone(phone):
    return re.match(r'(\+[0-9]+\s*)?(\([0-9]+\))?[\s0-9\-]+[0-9]+', phone)

is_valid_phone('43b') will return True - nehem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接