美文网首页
以逗号分隔字符串,但忽略双引号内的逗号

以逗号分隔字符串,但忽略双引号内的逗号

作者: oldestcrab | 来源:发表于2019-03-28 14:14 被阅读0次

以逗号分隔字符串,但忽略双引号内的逗号

现有数据格式如下,需要以逗号分隔字符串,但忽略双引号内的逗号,即"Anemia, Hemolytic"内的逗号不进行分割

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次或者无数次,\s*即表示如果是,,会匹配为'',这样数据分割出来的列表长度一致,下标对应的字符串不会混乱
  • (?![^"]*\"\,)表示匹配后面有"asg",的逗号,但是不匹配后面是asg",的逗号,重点是这个,分为两部分解释
    1. [^"]*\"\,在原始字符串模式下,表示匹配asdgdg",但是不匹配"asdgdg",
    2. 1(?!2)表示匹配13中的1,但是不匹配12中的1

      Positive and Negative Lookahead
      (pattern),(?:pattern),(?=pattern),(?!pattern)

组合在一起,在以逗号分割的时候,就可以忽略双引号中的逗号。
但是有一个问题,就是如果字符串尾部也有双引号的话,最后的双引号内的逗号会被分割,如下面字符串:

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"']

目前的解决办法是,在字符串后面加上,就可以让字符串尾部双引号内的逗号不被分割,但是这样分割出来的列表长度+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=';'

相关文章

  • 以逗号分隔字符串,但忽略双引号内的逗号

    以逗号分隔字符串,但忽略双引号内的逗号 现有数据格式如下,需要以逗号分隔字符串,但忽略双引号内的逗号,即"Anem...

  • List列表转换为字符串,以逗号分隔

    List列表转换为字符串,以逗号分隔 List转换为String

  • java字符串

    将一个数字字符串转换成逗号分隔的数字串,即从右边开始每三个数字用逗号分隔

  • split分割字符串

    :字符串既有中文又有英文逗号 (2) 以 中文 或 英文 逗号分割字符串:字符串既有中文又有英文逗号 拓展:使用正...

  • flutter 记录字符串相关

    以逗号分割的字符串转数组list = string.split(',');数组转以逗号分割的字符串string =...

  • Java之逗号操作符

    在说逗号操作符的时候我们要注意,逗号操作符不是逗号分隔符,逗号用作分隔符时用来分隔函数的不同参数。 Java里唯一...

  • Array方法总结

    toString() 返回数组中每个值的字符串形式拼接而成的以逗号分隔的字符串 valueOf() 返回的还是数组...

  • hive beeline到数据

    beeline 以逗号分隔导出数据到csv文件

  • python读写csv文件(csv)

    [CSV (Comma Separated Values)]即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号)...

  • Laravel 简单查询

    记录使用laravel查询sql的记录 查询某字段中包含以逗号分隔的字符串的数据 原生sql laravel

网友评论

      本文标题:以逗号分隔字符串,但忽略双引号内的逗号

      本文链接:https://www.haomeiwen.com/subject/wpuqbqtx.html