Python, разделять строку запятыми, кроме кавычек, игнорируя пробелы - PullRequest
0 голосов
/ 24 октября 2018

Я нашел некоторые решения, но результаты, которые я получаю, не соответствуют ожидаемым.

Я хочу взять строку и разделить ее запятыми, кроме случаев, когда запятыесодержится в двойных кавычках.Я хотел бы игнорировать пробелы.Я могу жить с потерей двойных кавычек в процессе, но это не обязательно.

Является ли 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 голосов
/ 24 октября 2018

Помимо использования 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


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

См. демонстрацию на regex101.com .

0 голосов
/ 24 октября 2018

Вы можете использовать регулярное выражение

".+?"|[\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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...