2017-01-15 93 views
0

字符串我有格式化爲以下csv文件:Python正則表達式替換爲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) 
+1

爲什麼* regex *?只要使用'str.replace('mammal [1]','mam')'就足以滿足您的要求 –

+1

@MoinuddinQuadri大概是因爲索引不總是'1'。 – excaza

+0

我有一個csv文件(下面的csv只是fomat的一個例子)巨大的行列表,取代它們就像這將需要幾天 – Fanna1119

回答

0

您可以使用下面的正則表達式的替換:

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

參見demonstration

0

無需正則表達式在這裏:

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)) 

注意:似乎在第二列中有一個前導空格。在這種情況下,在搜索/替換字符串前添加一個空格。

+0

使用這種方法可能很難在匹配項目之前完美替換(任意)領先空間,否則,這是超級! –

+0

我懷疑這個文件只是一個例子,爲了可讀性而添加了空格。謝謝你的評論。 –