Python使用re.findall提取手机号报TypeError错误问题求解
问题修正方案
报错原因分析
- 列表
l1中的元素未加引号,Python会将带-的内容识别为减法算术运算,最终得到整数类型,而re.findall()要求传入的匹配对象为字符串/字节类型,因此触发TypeError。 - 正则表达式规则与要求不符,你编写的
\d{2}-\d{3}-\d{4}是匹配开头2位数字的格式,不符合「开头3位、中间3位、末尾4位」的要求,且未加起止锚点会导致局部匹配错误。
修正后完整代码
import re # 所有手机号改为字符串格式 l1 = ["444-122-1234", "123-122-78999", "111-123-23", "67-7890-2019"] valid_numbers = [] # 正则调整为符合要求的规则,^匹配开头 $匹配结尾,避免局部匹配 pattern = r'^\d{3}-\d{3}-\d{4}$' for i in l1: res = re.findall(pattern, i) if res: valid_numbers.append(res[0]) print(f"符合规则的手机号:{res[0]}") print("所有合规手机号:", valid_numbers)
运行结果说明
运行后只会匹配到444-122-1234这个符合规则的手机号,其余不符合位数要求的都会被过滤。
内容的提问来源于stack exchange,提问作者Aritra Bhattacharyya
相关产品推荐
相关产品推荐

