以逗號分隔字符串,但忽略雙引號內(nèi)的逗號
現(xiàn)有數(shù)據(jù)格式如下,需要以逗號分隔字符串,但忽略雙引號內(nèi)的逗號,即"Anemia, Hemolytic"內(nèi)的逗號不進行分割
a = '11-BETA-HSD3,100174880,"Anemia, Hemolytic",MESH:D000743,,"Water Pollutants, Chemical",4.49,,22425172'
需要的效果如下:
['11-BETA-HSD3', '100174880', '"Anemia, Hemolytic"', 'MESH:D000743', '', '"Water Pollutants, Chemical"', '4.49', '', '22425172']
目前想到兩種方法,如下:
- 使用正則re.split進行字符串分割
- 使用csv模塊的reader進行分割
使用正則re.split進行字符串分割
import re
a = '11-BETA-HSD3,100174880,"Anemia, Hemolytic",MESH:D000743,,"Water Pollutants, Chemical",4.49,,22425172'
b = re.split(r',\s*(?![^"]*\"\,)', a)
print(len(b))
print(b)
9
['11-BETA-HSD3', '100174880', '"Anemia, Hemolytic"', 'MESH:D000743', '', '"Water Pollutants, Chemical"', '4.49', '', '22425172']
r',\s*(?![^"]*\"\,)'
-
r表示原始字符串,,表示以,分割 -
\s表示匹配空白字符,*表示匹配前一個字符0次或者無數(shù)次,\s*即表示如果是,,會匹配為'',這樣數(shù)據(jù)分割出來的列表長度一致,下標(biāo)對應(yīng)的字符串不會混亂 -
(?![^"]*\"\,)表示匹配后面有"asg",的逗號,但是不匹配后面是asg",的逗號,重點是這個,分為兩部分解釋-
[^"]*\"\,在原始字符串模式下,表示匹配asdgdg",但是不匹配"asdgdg", -
1(?!2)表示匹配13中的1,但是不匹配12中的1Positive and Negative Lookahead
(pattern),(?:pattern),(?=pattern),(?!pattern)
-
組合在一起,在以逗號分割的時候,就可以忽略雙引號中的逗號。
但是有一個問題,就是如果字符串尾部也有雙引號的話,最后的雙引號內(nèi)的逗號會被分割,如下面字符串:
import re
a = '11-BETA-HSD3,100174880,"Anemia, Hemolytic",MESH:D000743,,"Water Pollutants, Chemical",4.49,,"22425172,test"'
b = re.split(r',\s*(?![^"]*\"\,)', a)
print(len(b))
print(b)
10
['11-BETA-HSD3', '100174880', '"Anemia, Hemolytic"', 'MESH:D000743', '', '"Water Pollutants, Chemical"', '4.49', '', '"22425172', 'test"']
目前的解決辦法是,在字符串后面加上,就可以讓字符串尾部雙引號內(nèi)的逗號不被分割,但是這樣分割出來的列表長度+1,列表最后一個元素為''
import re
a = '11-BETA-HSD3,100174880,"Anemia, Hemolytic",MESH:D000743,,"Water Pollutants, Chemical",4.49,,"22425172,test"'
a = a + ','
b = re.split(r',\s*(?![^"]*\"\,)', a)
print(len(b))
print(b)
10
['11-BETA-HSD3', '100174880', '"Anemia, Hemolytic"', 'MESH:D000743', '', '"Water Pollutants, Chemical"', '4.49', '', '"22425172,test"', '']
使用csv模塊的reader進行分割
import csv
a = '11-BETA-HSD3,100174880,"Anemia, Hemolytic",MESH:D000743,,"Water Pollutants, Chemical",4.49,,22425172'
b = [a]
reader = csv.reader(b, delimiter=',')
for row in reader:
print(len(row))
print(row)
9
['11-BETA-HSD3', '100174880', 'Anemia, Hemolytic', 'MESH:D000743', '', 'Water Pollutants, Chemical', '4.49', '', '22425172']
使用這個方法簡單快速,其他的分隔符也可以使用,比如以;分割,則delimiter=';'