Python如何使用Regex打印数组中以指定数字开头的元素
问题背景
现有存储如下格式数据的文件:
Dave Martin 615-555-7164 173 Main St., Springfield RI 55924 davemartin@bogusemail.com Charles Harris 800-555-5669 969 High St., Atlantis VA 34075 charlesharris@bogusemail.com Eric Williams 560-555-5153 806 1st St., Faketown AK 86847 laurawilliams@bogusemail.com
需求为读取文件每一行,筛选出列表中以指定数字开头的元素存入新列表。
初始代码与报错
最初编写的代码如下:
from os import sep import re number = int(input("Number: ")) last_digit = number % 10 final = str(last_digit) results = [] with open("data.txt") as f: lines = f.readlines() desired = lines[2::5] results = re.findall('^[4][0-9]{2}$', desired) print(results)
运行时报错:
TypeError: expected string or bytes-like object
同时不知道如何把提取出的数字变量final代入正则规则,暂时硬编码为4。
问题原因
desired是lines[2::5]取出的地址行组成的列表,而re.findall的匹配对象要求是字符串/字节类型,直接传入列表就会触发类型错误。- 正则规则本身是字符串,要代入变量直接拼接即可,特殊字符用
re.escape处理避免影响正则逻辑。
最终解决代码
from os import sep import re number = int(input("Number: ")) last_digit = number % 10 final = str(last_digit) results = [] with open("data.txt") as f: lines = f.readlines() desired = lines[2::5] r = re.compile("[" + re.escape(final) + "][0-9]{2}.*") newlist = list(filter(r.match, desired)) print("********************") print(*newlist)
核心优化点:
- 先把正则规则编译成正则对象,用
r.match方法逐行匹配 - 用
filter遍历desired列表的所有元素,筛选出匹配的内容转为新列表
内容的提问来源于stack exchange,提问作者Nikola Knežević
相关产品推荐
相关产品推荐

