在循环浏览 CSV 文件时打印匹配的正则表达式(re类)不起作用?(在 Win 10 上使用 Python 3.6)



我正在尝试使用正则表达式通过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)

最新更新