2016-06-18 2 views
0

У меня есть этот код, чтобы разбить сложный CSV-файл на куски. Жесткий бит заключается в том, что запятые могут также отображаться внутри «", и поэтому их нельзя разделить. Регулярное выражение, я использую, чтобы найти запятые не внутри "" работает отлично: comma_re = re.compile(r',(?=([^"]*""[^"]*"")*[^"]*$)')Регулярное выражение "rest of string" split split

Демо: here

import re 


test = 'Test1,Test2,"",Test3,Test4"",Test5' 
comma_re = re.compile(r',(?=([^"]*""[^"]*"")*[^"]*$)') 

print comma_re.split(test) 

Выход:

['Test1', 'Test2,"",Test3,Test4""', 'Test2', '"",Test3,Test4""', '"",Test3,Test4""', None, 'Test5']

Желаемая: ['Test1', 'Test2', '"",Test3,Test4""', 'Test5']

Как может Я избегаю бесполезных результатов раскола?

Заранее благодарен!

UPDATE: Глупо, что я даже не знал о модуле csv по умолчанию, продолжал использовать это. Спасибо за ваши усилия!

+0

Пробовал модуль CSV еще? –

+0

Нет, еще нет, единственная сложная часть - расщепление, остальное мне нужно сделать очень просто ... – pietv8x

+0

Разбор csv-файла с регулярным выражением - такая плохая идея. Просто используйте построенный для этого модуль csv – Keatinge

ответ

1
(?<!"),(?![^",]+")|,(?=[^"]*$) 

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

input = 'Test1,Test2,"",Test3,Test4"",Test5' 
output = re.split(r'(?<!"),(?![^",]+")|,(?=[^"]*$)', input) 
print(output) 

# ['Test1', 'Test2', '"",Test3,Test4""', 'Test5'] 

Python demo

Вы действительно должны использовать парсер CSV для этого. Если по какой-то причине вы не можете - просто выполните ручную строковую обработку, пройдя символ по символу и разделив, когда увидите запятую, если вы не узнали, что находитесь в кавычной строке. Что-то вроде следующего:

input = 'Test1,Test2,"",Test3,Test4"",Test5' 

insideQuoted = False 
output = [] 
lastIndex = 0 

for i in range(0, len(input)): 
    if input[i] == ',' and not insideQuoted: 
     output.append(input[lastIndex: i]) 
     lastIndex = i + 1 
    elif input[i] == '"' and i < len(input) - 1 and input[i + 1] == '"': 
     insideQuoted ^= True 
    elif i == len(input) - 1: 
     output.append(input[lastIndex: i + 1]) 

Demo

Смежные вопросы