Не разделяйте слова в двойных кавычках с помощью Python string split ()? - PullRequest
11 голосов
/ 25 октября 2011

При использовании строковой функции Python split (), есть ли у кого-нибудь хитрый трюк для обработки элементов, заключенных в двойные кавычки, как неразрывное слово?

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

>>> myStr = 'A B\t"C" DE "FE"\t\t"GH I JK L" "" ""\t"O P   Q" R'
>>> myStr.split()
['A', 'B', '"C"', 'DE', '"FE"', '"GH', 'I', 'JK', 'L"', '""', '""', '"O', 'P', 'Q"', 'R']

Я бы хотел трактовать что-либо в двойных кавычках как одно слово, даже если в него вставлены пробелы, поэтому хотел бы получить следующее:

['A', 'B', 'C', 'DE', 'FE', 'GH I JK L', '', '', 'O P   Q', 'R']

Или хотя бы это, и тогда я скину двойные кавычки:

['A', 'B', '"C"', 'DE', '"FE"', '"GH I JK L"', '""', '""', '"O P   Q"', 'R']

Есть предложения без регулярных выражений?

Ответы [ 3 ]

34 голосов
/ 25 октября 2011

Вы не сможете получить такое поведение с str.split(). Если вы можете жить с довольно сложным синтаксическим анализом, который он выполняет (например, игнорируя двойные кавычки, перед которыми стоит обратная косая черта), shlex.split() может быть тем, что вы ищете:

>>> shlex.split(myStr)
['A', 'B', 'C', 'DE', 'FE', 'GH I JK L', '', '', 'O P   Q', 'R']
2 голосов
/ 25 октября 2011

@ Роб: почему без регулярных выражений, если решение регулярных выражений так просто?

my_str = 'A B\t"C" DE "FE"\t\t"GH I JK L" "" ""\t"O P   Q" R'
print re.findall(r'(\w+|".*?")', my_str)
['A', 'B', '"C"', 'DE', '"FE"', '"GH I JK L"', '""', '""', '"O P   Q"', 'R']
0 голосов
/ 25 октября 2011

Я предлагаю вам выполнить поиск с помощью re шаблона "[^"] * "и применить string.split только к оставшимся частям. Вы можете реализовать рекурсивную функцию, которая обрабатывает все соответствующие строковые части.

...