regex 用逗号分隔字符串,但忽略双引号内的逗号?

pdkcd3nj  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(184)

我有一些输入,如下所示:

A,B,C,"D12121",E,F,G,H,"I9,I8",J,K

逗号分隔的值可以是任何顺序。然而,如果某些内容包含在双引号中,我需要它忽略逗号并去掉引号。所以基本上,输出将是以下字符串列表:

['A', 'B', 'C', 'D12121', 'E', 'F', 'G', 'H', 'I9,I8', 'J', 'K']
v7pvogib

v7pvogib1#

Lasse是对的;它是一个逗号分隔的值文件,所以你应该使用csv module。一个简单的例子:

from csv import reader

# test
infile = ['A,B,C,"D12121",E,F,G,H,"I9,I8",J,K']
# real is probably like
# infile = open('filename', 'r')
# or use 'with open(...) as infile:' and indent the rest

for line in reader(infile):
    print line
# for the test input, prints
# ['A', 'B', 'C', 'D12121', 'E', 'F', 'G', 'H', 'I9,I8', 'J', 'K']
sqserrrh

sqserrrh2#

如果你正在寻找一个基于正则表达式的解决方案,一个简单的方法是用逗号分隔(,)或用引号分隔("(.*?)");然后过滤掉空值。

s = 'A,B,C,"D12121",E,F,G,H,"I9,I8",J,K'
splits = list(filter(None, re.split(r',|"(.*?)"', s)))
# ['A', 'B', 'C', 'D12121', 'E', 'F', 'G', 'H', 'I9,I8', 'J', 'K']

另一种方法是使用一种模式调用re.findall(),其中捕获引号之间的字符("(.*?)")或非逗号字符(([^,]+)),它创建一个2元组列表,其中一个值是空字符串;所以只要连接这些元组就可以了。

splits = list(map(''.join, re.findall(r'"(.*?)"|([^,]+)', s)))
# ['A', 'B', 'C', 'D12121', 'E', 'F', 'G', 'H', 'I9,I8', 'J', 'K']

也就是说,我相信标准的csv库是这里最好的解决方案。注意,csv.reader需要一个字符串列表,所以如果你想拆分一个字符串,请将其 Package 在一个函数中。

import csv
splits = next(csv.reader([s]))

相关问题