Python电话号码验证
这篇Python文章将展示我们如何使用Python的phonenumbers
库来验证电话号码。我们将学习使用Python来验证电话号码,然后根据地区、国家、大陆和运营商的情况来格式化它们。
我们将从一个简单的例子开始,然后转到一个复杂的例子。所以让我们开始吧,让Python验证和格式化电话号码。
在Python中验证电话号码
验证和确认电话号码的正确性可能是非常具有挑战性的。一个电话号码的格式可以根据我们的国家而改变。
即使在同一个国家,也可能有很大的差异。一些国家使用相同的国家代码,而其他国家则使用多个国家代码。
有些国家甚至不止一次地使用同一个国家代码。
谷歌在GitHub上的libphonenumber
存储库中的一个插图表明,美国、加拿大和加勒比海岛屿都使用相同的国际拨号代码+1。
从科索沃使用塞尔维亚、斯洛文尼亚或摩洛哥的国家代码就可以拨打这些电话号码。这些只是识别或验证电话号码时的几个困难。
乍一看,似乎可以用RegEx
来验证电话号码的国家代码。然而,这表明要验证一个国家的代码,我们必须为全球每个国家创建一个独特的RegEx
规则。
此外,移动电话运营商各自都有准则(例如,某些数字只能在特定的数字范围内使用)。我们可以看到,事情有可能很快失去控制,这将使我们自己验证电话号码的输入变得非常困难。
使用Python中的Phonenumbers
库
我们很幸运,因为一个Python库可以有效地指导我们完成验证过程。这个库来源于谷歌的libphonenumber
库,它也可以用于其他编程语言,如C++、Java和JavaScript。
PythonPhonenumbers
库就是使用这个库创建的。
本文将告诉我们如何使用Python来验证一个手机号码。
在Python中安装Phonenumbers
库
由于有一个集成模块,用Python验证电话号码变得很容易。这个模块被称为phonenumbers
模块。
为了使用这个模块,我们必须首先安装它。使用pip
,我们可以做到这一点:
pip install phonenumbers
一旦该模块安装完毕,我们就可以验证国家代码的电话号码了。
现在一切都已经设置好了,我们可以探索Phonenumbers
库。
用PythonPhonenumbers
库解析电话号码
电话号码几乎肯定是一个字符串,不管输入是来自网络表单还是其他来源,例如文本提取(本指南后面将介绍)。它需要用电话号码进行解析,然后转换为PhoneNumber
实例,然后我们才能使用它进行验证和其他用途。
导入库
首先,我们需要导入所需的库;我们将导入phonenumbers
。我们还需要导入carrier
,timezone
, 和geocoder
。
示例代码:
import phonenumbers
解析电话号码
我们可以从电话号码中提取有用的信息,这要感谢parse()
方法,其中包括以下内容:
示例代码:
import phonenumbers
My_number = "+92333920000"
Parse_number = phonenumbers.parse(My_number)
在使用phonenumbers.parse()
功能时,需要一个电话号码字符串作为输入。我们可以提供ISO Alpha-2格式的国家信息作为额外的可选输入。
例如,请记住下面这段代码:
Parse_number = phonenumbers.parse(My_number)
在ISO Alpha-2符号中,RO
表示罗马尼亚。我们可以用这个页面来查询全世界每个国家的Alpha-2和数字国家代码。
除非有必要,否则ISO Alpha-2国家代码将在大多数情况下被省略。
电话号码可以使用phonenumbers.parse()
,以验证常见的问题,如长度、前导零和符号。重要的是要记住,如果任何所需的条件没有得到满足,这个方法将抛出一个异常。
始终把它放在我们代码中的try/catch
块中。
现在我们的电话号码已经得到了适当的处理,我们可以进入验证阶段了。
使用is_possible_number()
方法验证电话号码
在Phonenumbers
,有两种方法可以用来验证一个电话号码。这些方法的主要区别是它们各自的速度和准确性水平。
为了进一步解释这个问题,让我们从is_possible_number()
函数开始。
示例代码:
import phonenumbers
My_number = "+92333920000"
Parse_number = phonenumbers.parse(My_number)
print(phonenumbers.is_possible_number(Parse_number))
输出:
True
该程序将产生一个值True
,作为其输出。
使用is_valid_number()
方法验证电话号码
现在,我们将使用同一个号码,但这次我们将使用is_valid_number()
方法来检查其有效性:
示例代码:
import phonenumbers
My_number = "+92333920000"
Parse_number = phonenumbers.parse(My_number)
print(phonenumbers.is_valid_number(Parse_number))
输出:
False
即使输入不变,输出也会不同。
is_possible_number()
通过检查电话号码的长度来猜测其有效性,而 方法检查其长度、前缀和区域。is_valid_number()
phonenumbers.is_possible_number()
在迭代一个大的电话号码列表时比 更快。这些结果并不总是准确的,如图所示。phonenumbers.is_valid_number()
它对快速消除长的电话号码很有帮助。使用起来很有风险。
使用Geocoder
类中的description_for_number()
方法来查找电话号码的位置
一个电话号码可以揭示其主人的许多细节,其中一些可能与我们的研究有关。因为与电话号码相关的特定运营商是影响产品整体成本的一个因素,我们可能想使用各种应用编程接口(API)或API端点。
我们可能想根据客户(电话号码)所在地的时区来发送我们的促销通知,这样我们就可以避免在半夜给他们发送信息。这将防止我们意外地把他们吵醒。
我们还可以获得电话号码的位置信息,以提供与之相关的信息。Phonenumbers
库使用户能够获得满足这些要求的工具。
我们将使用geocoder
类中提供的description_for_number()
方法,从位置开始。参数是一个已经解析过的电话号码和一个语言的短名称。
让我们用之前使用的假号码试试。
示例代码:
import phonenumbers
from phonenumbers import geocoder
My_number = phonenumbers.parse("+92333920000")
print("This number is from: "+geocoder.description_for_number(My_number, "en"))
输出:
This number is from: Pakistan
使用Carrier
类中的name_for_number()
方法来寻找电话号码的载体
我们将使用在carrier
类中找到的方法name_for_number()
。
示例代码:
import phonenumbers
from phonenumbers import carrier
My_number = phonenumbers.parse("+92333920000")
print("The carrier of the number is: "+carrier.name_for_number(My_number, "en"))
代码的输出:
The carrier of the number is: Ufone
使用Python验证电话号码并获得额外信息
示例代码:
import phonenumbers
from phonenumbers import carrier, timezone, geocoder
my_number = phonenumbers.parse("+92333920000", "GB")
print((phonenumbers.is_valid_number(my_number)))
print("The carrier of the number is: "+carrier.name_for_number(my_number, "en"))
print("The content and the city of the number are:")
print(timezone.time_zones_for_number(my_number))
print("The country this number belongs to is: "+geocoder.description_for_number(my_number, 'en'))
输出:
True
The carrier of the number is: Ufone
The content and the city of the number are:
('Asia/Karachi',)
The country this number belongs to is: Pakistan
这就是我们如何确定一个数字是否有效。我们在输出中看到True
,这表明Python代码中使用的号码是正确的。
我们还可以找出该数字的载体。在我们的例子中,它是Ufone
。
与运营商一起,我们可以找到国家、大陆和城市的名称。根据我们使用的号码,该号码来自亚洲,巴基斯坦,以及卡拉奇市。