193 - Valid Phone Numbers

本文介绍了一种使用正则表达式来筛选有效电话号码的方法。具体来说,文章提供了一个bash脚本,该脚本能够从文本文件中读取并打印符合特定格式要求的有效电话号码。

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

Subscribe to see which companies asked this question

思路分析:

此题的关键,正则表达式的匹配。

知识点

1、匹配必须发生在目标字符串的开头处,^必须出现在表达式的最前面才具有定位符作用。例如,“^o”与“ok”中的o匹配,但与“book”中的o不匹配。如果设置了RegExp对象实例的Multiline属性,^还会与行首匹配,即与“\n”、“\r”之后的位置匹配。光盘文件7.6.htm演示了该字符的使用,代码如下所示。

2、$匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。

3、x|y匹配x或y。例如,“z|food”能匹配“z”或“food”(此处请谨慎)。“(z|f)ood”则匹配“zood”或“food”。

4、[xyz]字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。

5、[^xyz]负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。

6、\  将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。

sed -nr '/^(\([0-9]{3}\) ){1}[0-9]{3}-[0-9]{4}$|^([0-9]{3}-){2}[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] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值