【问题标题】:Extract rows from csv file using regex substring?使用正则表达式子字符串从csv文件中提取行?
【发布时间】:2018-09-21 06:35:35
【问题描述】:

我有一个看起来像这样的 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

我正在尝试使用负前向提取行 UPanystring(在本例中为第 3 行和第 6 行)以排除第 1,2 和 4,5 行

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 中测试时,regex 搜索有效?

感谢 cmets:搜索代码现在看起来像

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)

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

【问题讨论】:

  • 您没有正确使用您的正则表达式 - 搜索使用 search.search(row[0]) 。在Pattern.search() 上阅读更多信息。
  • 谢谢 - 这两种情况都改变了输出我现在在输出列表中有所有行?
  • 您的整个if ... 声明现在看起来如何?
  • 谢谢,我想我在 .search 语法上苦苦挣扎。已添加到原始问题中。
  • 使用if not search.search(row[0]): ... 仅传递与您的模式不匹配的行。

标签: regex python-3.x csv


【解决方案1】:

您想要返回包含_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']

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多