使用正则表达式子字符串从csv文件中提取行?

时间:2018-09-21 06:35:36

标签: regex python-3.x csv

我有一个csv文件,看起来像这样(显然就是这样)。

<anystring>tony_UPearly_start,1,2,3
<anystring>tony_UPlate_start,4,5,6
<anystring>tony_UP<anystring>_start,7,8,9
<anystring>jane_UPearly_start,1,2,3
<anystring>jane_UPlate_start,4,5,6
<anystring>jane_UP<anystring>_start,7,8,9

我正尝试使用否定的期望来排除行1,2和4,5的行UPanystring(在本示例中为行3和6)

import re
import csv

search = re.compile(r'.*_UP(?!early|late)')
output = []

with open('test.csv', mode='r', encoding='utf-8') as f:
    csvfile = csv.reader(f)
    for row in csvfile:
        if row[0] == search:
            output.append(row)

print(output)

>>>[]

我在什么时候

print (output)

[<anystring>tony_UP<anystring>_start,7,8,9, <anystring>jane_UP<anystring>_start,7,8,9]

当我在regex平台上进行测试但不在python中进行测试时,正则表达式搜索有效吗?

感谢您的评论:搜索代码现在看起来像

search = re.compile(r'^.*?_UP(?!early|late).*$')
output = []

with open('test.csv', mode='r', encoding='utf-8') as f:
    csvfile = csv.reader(f)
    for row in csvfile:
        search.search(row[0]) # it think this needs and if=true but it won't accept a boolean here?
        output.append(row)

现在返回所有行(即不过滤任何内容,而在过滤所有内容之前)

1 个答案:

答案 0 :(得分:0)

您要返回包含_UP而不是earlylate的行的列表。

图案应该看起来像

search = re.compile(r'_UP(?!early|late)')

您不需要任何^.*等,因为当您使用re.search时,您正在查找字符串内任何地方的模式匹配。

然后,您只需要测试正则表达式匹配的行即可:

if search.search(row):
    output.append(row)

请参见Python demo

import re

csvfile="""<anystring>tony_UPearly_start,1,2,3
<anystring>tony_UPlate_start,4,5,6
<anystring>tony_UP<anystring>_start,7,8,9
<anystring>jane_UPearly_start,1,2,3
<anystring>jane_UPlate_start,4,5,6
<anystring>jane_UP<anystring>_start,7,8,9""".splitlines()

search = re.compile(r'_UP(?!early|late)')
output = []

for row in csvfile:
    if search.search(row):
        output.append(row)

print(output)

输出是您期望的列表:

['<anystring>tony_UP<anystring>_start,7,8,9', '<anystring>jane_UP<anystring>_start,7,8,9']