在CSV文件中循环时,打印匹配的Regex(重分类)不起作用?(在Win 10上使用Python 3.6)

2024-03-29 00:10:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Regex返回加拿大邮政编码通过一个CSV文件的每一行。你知道吗

环境:在win10上运行python3.6。通过Jupyter笔记本和Win 10 CLI提示符测试代码。你知道吗

问题是,当通过CSV文件使用FOR循环找到对象时,我似乎无法让对象返回字符串。你知道吗

在列表中使用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]\s\d[a-z]\d\b')

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]\s\d[a-z]\d\b')
        postcode = filter(regex.search, row[7])
        print(postcode)

输出:

<filter object at 0x000001E4FA70D908>

似乎每次迭代都会找到对象过滤器对象

我的理解是,我可以在CSV中循环,因为每一行都会返回一个列表或元组,然后我可以使用*re在字符串中的特定列中使用其索引来查找匹配的模式。你知道吗

我哪里出错了?你知道吗


Tags: 文件csv对象字符串importre列表address
1条回答
网友
1楼 · 发布于 2024-03-29 00:10:32

您不需要在循环中使用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])

或者,您可以先创建一个行列表,然后运行filter

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]\s\d[a-z]\d\b')
goodPostalCode = filter(regex.search, lines)

相关问题 更多 >