193. Valid Phone Numbers

本文介绍了一种使用正则表达式从文本文件中筛选有效电话号码的方法。通过egrep、awk及sed三种工具,实现对两种格式电话号码的精确匹配:(xxx)xxx-xxxx或xxx-xxx-xxxx。

Given a text file file.txt that contains list of phone numbers (one per line), write a one liner bash script to print all valid phone numbers.

You may assume that a valid phone number must appear in one of the following two formats: (xxx) xxx-xxxx or xxx-xxx-xxxx. (x means a digit)

You may also assume each line in the text file must not contain leading or trailing white spaces.

For example, assume that file.txt has the following content:
987-123-4567
123 456 7890
(123) 456-7890

Your script should output the following valid phone numbers: 987-123-4567
(123) 456-7890


重点是命令+正则表达式
1. egrep用正则表达式选择含有符合要求的字符串的行

egrep '^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}\$'  file.txt

其中,egrep等价于grep -e,支持扩展的正则表达式,因为这里用了(|)。
^,$分别用来确定字符串的开始和结尾;对于123-或者(123)空格,用(word1|word2)兼容,即
([0-9]{3}-|\([0-9]{3}\) );当然[0-9]可以用[[:digit:]] 代替
2. awk的使用正则,字符匹配
awk '/word/' file,其中//中的就是正则表达的字符串

awk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}\$/' file.txt #或
awk '/^([[:digit:]]{3}-|\([[:digit:]]{3}\) )[[:digit:]]{3}-[[:digit:]]{4}$/' file.txt

3. sed+正则匹配
sed -r: 表示支持正则表达; -n: 表示安静模式,只输出处理的那一行。

sed -n -r '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/p' file.txt

其中,//中的是用正则表达式表示的字符串。

<think>好的,我需要回答用户关于phonenumbers库的使用说明、示例和介绍。首先,我得整理已有的信息,特别是用户提供的四个引用内容。 引用1提到了PhoneNumberOfflineGeocoder和PhoneNumberToCarrierMapper,这两个类分别用于获取地理位置和运营商信息。引用2展示了仓颉三方库中使用phonenumber4cj的代码示例,包括解析号码和获取类型。引用3提到数字签名的示例仅用于演示,但这里可能不相关。引用4则推荐了Python-Phonenumbers项目,并给出了项目地址,说明它是Google的libphonenumber的Python移植。 用户主要想了解phonenumbers库,所以重点应放在Python版本上,即引用4提到的python-phonenumbers。需要介绍库的功能,比如解析、验证、格式化电话号码,以及获取地理位置和运营商信息。然后给出安装方法,比如pip install phonenumbers。接着是使用示例,比如解析号码、验证有效性、格式化输出、获取地理位置和运营商。这些示例可以参考引用2中的代码结构,但用Python语法改写。例如,解析号码后使用geocoder和carrier模块获取信息。同时,要提到国际号码需要带国家代码,并且不同国家可能有不同的验证规则。最后,给出相关项目地址,如引用4中的链接。 可能还需要补充一些注意事项,比如处理号码时的常见错误,或者性能优化,如引用3提到的压缩和优化代码,不过这部分可能不直接相关。要确保示例代码正确,符合Python语法,比如正确导入模块,调用函数的方法。 最后,生成相关问题需要考虑用户可能进一步想知道的内容,比如如何验证号码、处理国际号码、获取更多信息的方法,以及与其他库的比较或实际应用场景。</think>### phonenumbers库介绍及使用说明 phonenumbers是Google libphonenumber库的Python移植版本,用于解析、验证和格式化国际电话号码,支持获取号码地理位置、运营商等信息[^4]。 #### 核心功能 1. 号码解析与验证 2. 格式标准化输出 3. 地理位置信息查询 4. 运营商信息识别 5. 号码类型判断(固话/手机/免费号码等) --- ### 安装方法 ```bash pip install phonenumbers ``` --- ### 基础使用示例 #### 1. 号码解析与验证 ```python import phonenumbers # 解析电话号码 phone = phonenumbers.parse("+8613812345678", None) # 必须包含国家代码 # 验证有效性 print(phonenumbers.is_valid_number(phone)) # 输出: True # 获取国家代码 print(phone.country_code) # 输出: 86 ``` #### 2. 格式标准化 ```python # 转换为国际标准格式 print(phonenumbers.format_number(phone, phonenumbers.PhoneNumberFormat.INTERNATIONAL)) # 输出: +86 138 1234 5678 # 转换为本地格式 print(phonenumbers.format_number(phone, phonenumbers.PhoneNumberFormat.NATIONAL)) # 输出: 138 1234 5678 ``` #### 3. 地理位置查询 ```python from phonenumbers import geocoder # 获取中文地理位置描述 location = geocoder.description_for_number(phone, "zh") print(location) # 输出: 中国 ``` #### 4. 运营商识别 ```python from phonenumbers import carrier # 获取运营商信息(需开启数据加载) carrier_name = carrier.name_for_number(phone, "zh") print(carrier_name) # 输出: "中国移动" 或其他运营商 ``` --- ### 高级功能示例 ```python # 获取号码类型 from phonenumbers import PhoneNumberType number_type = phonenumbers.number_type(phone) print("手机号码" if number_type == PhoneNumberType.MOBILE else "其他类型") # 生成号码示例 example_number = phonenumbers.example_number("CN") print(phonenumbers.format_number(example_number, phonenumbers.PhoneNumberFormat.INTERNATIONAL)) ``` --- ### 注意事项 1. 必须包含国家代码(如中国+86) 2. 不同国家/地区的号码验证规则不同 3. 地理位置和运营商数据需要单独加载数据库 4. 支持170+国家/地区的号码处理 项目地址:https://gitcode.com/gh_mirrors/py/python-phonenumbers [^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值