如何使用正则表达式(Regex)从多种文本类型提取电话号码
问题解决:从多格式文本中提取电话号码
问题背景
现有以下几种格式的字符串,需要用正则表达式提取其中的电话号码,需支持不同号码类型的顺序(Office在前/在后)、仅含单一类型号码的场景,期望结果示例:(000) 987-9728, (000) 312-9725
原代码如下:
import re a = "Office: (000) 987-9728, Mobile: (000) 312-9725" b = "Mobile: (000) 312-8750, Office: (000) 987-9728" c = "Mobile: (000) 312-8750" d = "Office: (000) 987-9728" search_office_phone = re.search("Office:\s?(.*),|Office:\s?(.*)",a) if search_office_phone: office_number = search_office_phone.group(1) print(office_number)
原代码问题分析
- 正则分支导致分组混乱:使用
Office:\s?(.*),|Office:\s?(.*)的分支逻辑,匹配结果会分散在两个分组中,代码仅取group(1)会出现匹配第二个分支时结果为None的情况(比如处理字符串b时)。 - 功能单一:仅尝试提取Office号码,未覆盖Mobile号码的提取需求,也无法一次性获取所有电话号码。
解决方案1:按类型提取指定号码
如果需要分别提取Office或Mobile类型的号码,可优化正则逻辑,确保精准捕获对应号码:
import re def extract_phone_by_type(text, phone_type): # 匹配指定类型标签后的电话号码,兼容号码后带逗号或位于文本末尾的情况 pattern = rf"{phone_type}:\s?(\(\d{{3}}\) \d{{3}}-\d{{4}})(?:,|$)" match_result = re.search(pattern, text) return match_result.group(1) if match_result else None # 测试示例字符串 a = "Office: (000) 987-9728, Mobile: (000) 312-9725" b = "Mobile: (000) 312-8750, Office: (000) 987-9728" c = "Mobile: (000) 312-8750" d = "Office: (000) 987-9728" print("a的Office号码:", extract_phone_by_type(a, "Office")) print("a的Mobile号码:", extract_phone_by_type(a, "Mobile")) print("b的Office号码:", extract_phone_by_type(b, "Office")) print("c的Mobile号码:", extract_phone_by_type(c, "Mobile")) print("d的Office号码:", extract_phone_by_type(d, "Office"))
输出结果:
a的Office号码: (000) 987-9728 a的Mobile号码: (000) 312-9725 b的Office号码: (000) 987-9728 c的Mobile号码: (000) 312-8750 d的Office号码: (000) 987-9728
解决方案2:一次性提取所有电话号码
如果只需提取所有符合格式的电话号码(不区分类型),可直接匹配号码的通用格式:
import re def extract_all_phones(text): # 匹配(XXX) XXX-XXXX格式的电话号码 phone_pattern = r"\(\d{3}\) \d{3}-\d{4}" return re.findall(phone_pattern, text) # 测试示例字符串 a = "Office: (000) 987-9728, Mobile: (000) 312-9725" b = "Mobile: (000) 312-8750, Office: (000) 987-9728" c = "Mobile: (000) 312-8750" d = "Office: (000) 987-9728" print("a的所有号码:", ", ".join(extract_all_phones(a))) print("b的所有号码:", ", ".join(extract_all_phones(b))) print("c的所有号码:", ", ".join(extract_all_phones(c))) print("d的所有号码:", ", ".join(extract_all_phones(d)))
输出结果:
a的所有号码: (000) 987-9728, (000) 312-9725 b的所有号码: (000) 312-8750, (000) 987-9728 c的所有号码: (000) 312-8750 d的所有号码: (000) 987-9728
内容的提问来源于stack exchange,提问作者Ben David
相关产品推荐
相关产品推荐

