2015-07-27 4 views
1

Я новичок в Python и у меня есть строка раздвоение проблема, которая мне нужна помощьPython - Сплит строки в параметры

input = "\"filename.txt\", 1234,8973,\"Some Description \"" 

input содержит обе строки & номера, и там могут быть случаи, когда существуют ведущие и хвостовые пробелы

ожидается выход должен быть

['filename.txt', '1234', '8973', 'Some Description'] 

Можно разделить сделать работу или мне нужно регулярные выражения?

+1

Может ли быть запятой в '\" string \ "' между двумя запятыми? – wenzul

+2

Почему вы сначала не пытаетесь «разбить» и посмотреть, работает ли это, а не спрашивать? Занимает 10 секунд, чтобы попробовать. –

ответ

1
>>> [s.strip(' "') for s in input.split(',')] 
['filename.txt', '1234', '8973', 'Some Description'] 

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

8

Используйте csv module для обработки ввода; он обрабатывает цитирование, можно научить о ведущих пробелов, и конечные пробелы могут быть удалены после:

import csv 

reader = csv.reader(inputstring.splitlines(), skipinitialspace=True) 
row = next(reader) # get just the first row 
res = [c.strip() for c in row] 

Демо:

>>> import csv 
>>> inputstring = '"filename.txt", 1234,8973,"Some Description "' 
>>> reader = csv.reader(inputstring.splitlines(), skipinitialspace=True) 
>>> row = next(reader) 
>>> [c.strip() for c in row] 
['filename.txt', '1234', '8973', 'Some Description'] 

Это имеет дополнительное преимущество, что вы можете использовать запятые в значениях , при условии, что они указаны:

>>> with_commas = '"Hello, world!", "One for the money, two for the show"' 
>>> reader = csv.reader(with_commas.splitlines(), skipinitialspace=True) 
>>> [c.strip() for c in next(reader)] 
['Hello, world!', 'One for the money, two for the show'] 

объект csv.reader() принимает iterabl e в качестве первого аргумента; Я использовал str.splitlines() method, чтобы превратить (потенциально многострочную) строку в список; вы также можете использовать [inputstring], если ваша строка ввода всегда одна строка.

+0

Еще 40 ударов плетью для ввода;) –

+1

@PadraicCunningham: расскажите об этом OP! :-) –

1

Вы можете использовать Python map и lambda для этого ..

In [9]: input = "\"filename.txt\", 1234,8973,\"Some Description \"" 
In [11]: input = map(lambda x: x.strip(), input.split(',')) 
In [14]: input = map(lambda x: x.strip('"'), input) 
In [16]: input = map(lambda x: x.strip(), input) 
In [17]: input 
Out[17]: ['filename.txt', '1234', '8973', 'Some Description'] 
0

Вы могли бы сделать, как

li=input.split(",") 

это будет приносить вам

li=['"filename.txt"', ' 1234', '8973', '"Some Description "'] 

затем использовать LTRIM и RTrim соответственно см. How to trim whitespace (including tabs)? для получения более подробной информации

0

Используйте модуль re.

Попробуйте следующий код:

import re 
filter(lambda x: x != '', re.split(",| |\"", input)) 

Выход будет:

['filename.txt', '1234', '8973', 'Some', 'Description'] 
+0

если в имени файла и описании есть пробелы, этот код не будет работать должным образом – Dennis

0

вы можете просто использовать eval() функцию

input = "\"filename.txt\", 1234,8973,\"Some Description \"" 
>>> list(eval(input)) 
['filename.txt', 1234, 8973, 'Some Description '] 
Смежные вопросы