python-phonenumbers电话号码格式化解析

phonenumbers

就是解析,格式化和验证国际电话号码的python库。

安装

pip install phonenumbers -i https://pypi.douban.com/simple/

用法

text = ''
# 需要指定号码的国家(除非号码是全球唯一的E.164格式)
for match in phonenumbers.PhonenumberMatcher(text, 'US'):
print(match) # PhoneNumberMatch [11,23) 510-748-8230
print(phonenumbers.format_number(match.number, phonenumbers.PhoneNumberFormat.E164)) # +510-748-8230
号码验证
# 不是一个号码,原因是位数太少
>>> z = phonenumbers.parse("+120012301", None)
>>> phonenumbers.is_possible_number(z)  # too few digits for USA
False
>>> phonenumbers.is_valid_number(z)
False
# 不是“有效”的号码,原因是NPA 200 not used

>>> z = phonenumbers.parse("+12001230101", None)
>>> phonenumbers.is_possible_number(z)
False
>>> phonenumbers.is_valid_number(z)  # NPA 200 not used
False

格式化号码

# 一旦你得到了一个电话号码,通常的任务是将其格式化到一个标准的格式
>>> phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.NATIONAL)
u'020 8366 1177'
>>> phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
u'+44 20 8366 1177'
>>> phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.E164)
u'+442083661177'
PhoneNumberMatch

有时,你得到一大块文本,里面有可能有电话号码,也可能没有。PhoneNumberMatcher对象 提供了相关功能,遍历它得到一个PhoneNumberMatch对象的序列。每一个match对象包含了一个PhoneNumber对象以及在原字符串中匹配位置的信息。

英文文本
>>> text = "Call me at 510-748-8230 if it's before 9:30, or on 703-4800500 after 10am."
>>> for match in phonenumbers.PhoneNumberMatcher(text, "US"):
...     print match
...
PhoneNumberMatch [11,23) 510-748-8230
PhoneNumberMatch [51,62) 703-4800500
>>> for match in phonenumbers.PhoneNumberMatcher(text, "US"):
...     print phonenumbers.format_number(match.number, phonenumbers.PhoneNumberFormat.E164)
...
+15107488230
+17034800500
中文文本
text = u"非常紧急转告:被告**,户籍地址:山东***室 。济南律师事务所郑重告知:因你恶意拖欠佰仟金融公司的贷款,我所已经将你“涉嫌贷款诈骗罪”的相关材料已递交到公安局。请保持手机24小时处于待机状态,接受当地公安24小时内随时传唤或询问。原告律师-张良  办公室:0531-8235 0561  手机:15753145942 电话这几天打遍所有联系人 和单位。 结果 让济南的朋友 在 电信局 通过熟人 查到 0531-8235 0561   是济南德盈律师事务所的, 还冒充 济南律师事务所"
for match in phonenumbers.PhoneNumberMatcher(text, "CN"):
    print match
    print phonenumbers.format_number(match.number,phonenumbers.PhoneNumberFormat.NATIONAL)

# PhoneNumberMatch [129,143) 0531-8235 0561
# 0531 8235 0561
# PhoneNumberMatch [148,159) 15753145942
# 157 5314 5942
# PhoneNumberMatch [202,216) 0531-8235 0561
# 0531 8235 0561

text = u"你还为被人骗了而烦恼吗? 找我就对了,专业轰炸 专业催收 合作qq937852948"
for match in phonenumbers.PhoneNumberMatcher(text, "CN"):
    print match
    print phonenumbers.format_number(match.number,phonenumbers.PhoneNumberFormat.NATIONAL)

# 无结果

text = u"02138510106这个是催收电话吗?"
for match in phonenumbers.PhoneNumberMatcher(text, "CN"):
    print match
    print phonenumbers.format_number(match.number, phonenumbers.PhoneNumberFormat.NATIONAL)
    
# PhoneNumberMatch [0,11) 02138510106
# 021 3851 0106

text = u"是这样的,12月1号01095595电话邀请账单分期提额到10万,上个月我自己做了个分期,分期后还款3000多,可是我错就错在当天全额还上了,可是昨天光大银行的催收部门给我打电话,说我上个月没有还款,然后晚上就致电4008111333,确认已经产生滞纳金,于是我当即就还上了,请问卡友们,像这样的情况,三个月后我还能申请临时额度提高吗?以前申请可是从来没有拒绝过"
for match in phonenumbers.PhoneNumberMatcher(text, "CN"):
    print match
    print phonenumbers.format_number(match.number, phonenumbers.PhoneNumberFormat.NATIONAL)

# PhoneNumberMatch [10,18) 01095595
# 010 95595
# PhoneNumberMatch [107,117) 4008111333
# 400 811 1333

再试几个号码格式化的例子,这次把原始字符串弄得“奇怪”些,PhoneNumberFormat.NATIONAL

number_list = ["182--6008--6180",
               "1826*00*86180",
               "025-5763062*0"]

for phone in phonenumber_list:
    x = phonenumbers.parse(phone, "CN")
    print phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.NATIONAL)
    
# 182 6008 6180
# 182 6008 6180
# 025 5763 0620

PhoneNumberMatcher 方法有一个leniency参数,可以调整判断的严格程度。

你可能感兴趣的:(python-phonenumbers电话号码格式化解析)