Python,以逗号分隔字符串(引号内除外),忽略空格

时间:2018-10-24 06:29:25

标签: python regex csv split

我找到了一些解决方案,但是得到的结果与我期望的结果不符。

我想要一个字符串,并用逗号将其分割,除非逗号包含在双引号中。我想忽略空格。在此过程中,我可以忍受双引号的丢失,但这不是必需的。

csv是执行此操作的最佳方法吗?正则表达式解决方案会更好吗?

#!/usr/local/bin/python2.7

import csv

s = 'abc,def, ghi, "jkl, mno, pqr","stu"'

result = csv.reader(s, delimiter=',', quotechar='"')

for r in result: 
    print r

# Should display:
# abc
# def
# ghi
# jkl, mno, pqr
# stu
#
# But I get:
# ['a']
# ['b']
# ['c']
# ['', '']
# ['d']
# ['e']
# ['f']
# ['', '']
# [' ']
# ['g']
# ['h']
# ['i']
# ['', '']
# [' ']
# ['jkl, mno, pqr']
# ['', '']
# ['stu']

print r[1]  # Should be "def" but I get and "list index out of range" error.

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式

".+?"|[\w-]+

这将匹配双引号,后跟任何字符,直到找到下一个双引号-或,它将匹配单词字符(无逗号或双引号)。

https://regex101.com/r/IThYf7/1

import re
s = 'abc,def, ghi, "jkl, mno, pqr","stu"'
for r in re.findall(r'".+?"|[\w-]+', s):
    print(r)

如果您想摆脱引号中的",我可以通过使用regex模块(使\K可用)找出最好的方法:

(?:^"?|, ?"?)\K(?:(?<=").+?(?=")|[\w-]+)

https://regex101.com/r/IThYf7/3

答案 1 :(得分:0)

除了使用csv之外,您还可以使用另一种不错的方法,该方法受到更新的regex模块(即pip install regex)的支持:

"[^"]*"(*SKIP)(*FAIL)|,\s*


内容如下:

"[^"]*"(*SKIP)(*FAIL) # match everything between two double quotes and "forget" about them
|                     # or
,\s*                  # match a comma and 0+ whitespaces


Python中:

import regex as re

rx = re.compile(r'"[^"]*"(*SKIP)(*FAIL)|,\s*')
string = 'abc,def, ghi, "jkl, mno, pqr","stu"'

parts = rx.split(string)
print(parts)

这产生

['abc', 'def', 'ghi', '"jkl, mno, pqr"', '"stu"']

请参见a demo on regex101.com