我正在尝试使用正则表达式通过CSV文件的每一行返回加拿大邮政编码。
环境:Win 10上的Python 3.6。通过 Jupyter Notebook 和 Win 10 CLI 提示符测试的代码。
问题是,当使用 FOR 循环通过 CSV 文件找到对象时,我似乎无法让对象返回字符串。
通过列表使用 re 工作正常:
import re
address = [ 'H1T3R9',
'/a/b/c/la_seg_x005_y003.npy',
'H1K 3H3',
'F2R2V2',
'H1L 3W6',
'j1r 4v5',
'/y',
'h2r 2x8',
'J9R 5V9',
'Non disponible, h2r 2x8, montreal']
# I also tried this one at some point,# r'^((d{5}-d{4})|(d{5})|([AaBbCcEeGgHhJjKkLlMmNnPpRrSsTtVvXxYy]d[A-Za-z]s?d[A-Za-z]d))$))
regex = re.compile(r'b[a-z]d[a-z]sd[a-z]db')
goodPostalCode = filter(regex.search, address)
print(*goodPostalCode)
输出:
j1r 4v5 h2r 2x8 Non disponible, h2r 2x8, montreal
但是在添加CSV组件时,它似乎中断了。
import re
import csv
with open('data.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
#print(row)
regex = re.compile(r'b[a-z]d[a-z]sd[a-z]db')
postcode = filter(regex.search, row[7])
print(postcode)
输出:
<filter object at 0x000001E4FA70D908>
对象过滤器对象似乎每次迭代都能找到
我的理解是,我可以遍历 CSV,因为每一行都会返回一个列表或元组,然后我可以使用 *re 使用其索引在特定列的字符串中找到匹配的模式。
我哪里出错了?
你不需要在循环中使用filter
,因为row[7]
的值是一个字符串,而不是字符串列表。
codes = []
with open('data.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
if regex.search(row[7]):
codes.append(row[7])
或者,您可以先创建行列表,然后运行过滤器
with open('data.csv', newline='') as f:
reader = csv.reader(f)
lines = [row[7] for row in reader]
regex = re.compile(r'b[a-z]d[a-z]sd[a-z]db')
goodPostalCode = filter(regex.search, lines)