【问题标题】:Python regular expression to replace strings in csvPython正则表达式替换csv中的字符串
【发布时间】:2017-01-15 14:56:43
【问题描述】:

我有一个格式如下的 csv 文件:

   cat, mammal[1]
   shark, fish[2]
   dog, mammal[3]
   tiger, mammal[4]
   salmon, fish[5]

我想用方括号替换所有包含哺乳动物的行。

输出应该如下:

cat, mam
shark, fish[2]
dog, mam
tiger, mam
salmon, fish[5]

到目前为止,我有一个读/写 csv 文件的代码:

import csv


with open('animals.csv', 'r') as fin, open("out.csv",'w') as fout:
        writer = csv.writer(fout)
        for row in csv.reader(fin):
            re.sub(???) #stuck at writing the regular expression
            writer.writerow(row)

【问题讨论】:

  • 为什么是 regex?只需使用 str.replace('mammal[1]', 'mam') 即可满足您的要求
  • @MoinuddinQuadri 大概是因为索引并不总是1
  • 我在 csv 文件中有一个巨大的行列表(下面的 csv 只是格式的一个示例),像这样替换它们需要几天时间
  • @Fanna1119 我看不出运行str.replace 需要几天时间...如果您想要性能,请参阅我使用writerows 和生成器理解的解决方案。但我怀疑我的代码会因输入格式而窒息……您没有与我们分享。

标签: python regex python-3.x csv


【解决方案1】:

您可以使用以下正则表达式进行替换:

for row in csv.reader(fin):
    row[1] = re.sub(r'(\s*mam)mal\[\d+\]', '\1', row[1])
    writer.writerow(row)

demonstration

【讨论】:

    【解决方案2】:

    这里不需要正则表达式:

    for row in csv.reader(fin):
        if row[1].startswith("mammal["):
           row[1] = "mam"
    

    性能最好,因为

    • 没有正则表达式
    • 仅在匹配时替换字符串,否则保持不变

    使用生成器理解和writerows 甚至更快:

    with open('animals.csv', 'r') as fin, open("out.csv",'w') as fout:
        csv.writer(fout).writerows([row[0],"mam"] if row[1].starswith("mammal[") else row for row in csv.reader(fin))
    

    注意:似乎第二列中有一个前导空格。在这种情况下,请在搜索/替换字符串前添加一个空格。

    【讨论】:

    • 用这种方法可能很难完美替换匹配项之前的(任意)前导空格,否则,这就是超级!
    • 我怀疑该文件只是一个示例,添加空格是为了便于阅读。感谢您的评论。
    猜你喜欢
    • 2022-11-07
    • 2013-06-13
    • 1970-01-01
    • 2018-07-13
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多