国际电话号码验证

时间:2011-12-06 21:00:02

标签: python validation

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

2 个答案:

答案 0 :(得分:5)

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

  1. 为每个国家/地区代码精心创建数字格式的数据库。然后定期检查每个国家/地区的更新。 (编辑:它看起来像Google already does this,所以如果你信任他们和Python移植器来保持libphonenumber的正确和最新,并且不介意每次有变化时升级这个库,这可能适用于你。)
  2. 删除所提供电话号码中的所有分隔符,并将其格式化,不加任何间距:+12128675309
  3. 在用户提供数字时格式化数字,而不是错误地重新格式化数字。

答案 1 :(得分:0)

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

  • 最终,以国家代码
  • 的+和一些数字开头
  • 最终,包含一组括号内部区域代码或可选0
  • 以数字
  • 结束
  • 在数字本身中包含空格或短划线(不在国家或地区代码中):
def is_valid_phone(phone):
    return re.match(r'(\+[0-9]+\s*)?(\([0-9]+\))?[\s0-9\-]+[0-9]+', phone)