以逗號分隔字符串,但忽略雙引號內(nèi)的逗號

以逗號分隔字符串,但忽略雙引號內(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']

目前想到兩種方法,如下:

  1. 使用正則re.split進行字符串分割
  2. 使用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",的逗號,重點是這個,分為兩部分解釋
    1. [^"]*\"\,在原始字符串模式下,表示匹配asdgdg",但是不匹配"asdgdg",
    2. 1(?!2)表示匹配13中的1,但是不匹配12中的1

      Positive 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=';'

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 最先接觸編程的知識是在大學(xué)里面,大學(xué)里面學(xué)了一些基礎(chǔ)的知識,c語言,java語言,單片機的匯編語言等;大學(xué)畢...
    oceanfive閱讀 3,367評論 0 7
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,695評論 0 5
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,665評論 0 4
  • 第 3 章目錄: 3.1 shell 語法3.2 shell 命令3.3 shell 函數(shù)3.4 shell 參數(shù)...
    C86guli閱讀 6,598評論 2 4
  • 1. 建立邏輯卷存放wiki數(shù)據(jù) 建立新分卷 /dev/sda3 建立邏輯卷 建立目錄存放wiki數(shù)據(jù) 2. 安裝...
    陽光_8af8閱讀 1,126評論 0 0

友情鏈接更多精彩內(nèi)容