является несовместимым python str.split ()? - PullRequest
3 голосов
/ 22 марта 2012
>>> ".a string".split('.')
['', 'a string']

>>> "a .string".split('.')
['a ', 'string']

>>> "a string.".split('.')
['a string', '']

>>> "a ... string".split('.')
['a ', '', '', ' string']

>>> "a ..string".split('.')
['a ', '', 'string']

>>> 'this  is a test'.split(' ')
['this', '', 'is', 'a', 'test']

>>> 'this  is a test'.split()
['this', 'is', 'a', 'test']

Почему split() отличается от split(' '), когда вызываемая строка имеет пробелы только в виде пробелов?

Почему split('.') разделяет "..." на ['','']?split() не считает пустое слово между 2 разделителями ...

В документах об этом ясно (см. @Agf ниже), но я хотел бы знать, почему это выбранное поведение.

Я посмотрел в исходном коде ( здесь ) и мыслительная строка 136 должна быть чуть меньше: ... i < str_len ...

1 Ответ

13 голосов
/ 22 марта 2012

См. str.split документы , это поведение специально упоминается:

Если задано sep, последовательные разделители не группируются и считаются разделителями пустых строк (например, '1,,2'.split(',') возвращает ['1', '', '2']). Аргумент sep может состоять из нескольких символы (например, '1<>2<>3'.split('<>') возвращает ['1', '2', '3']). Разделение пустой строки с указанным разделителем возвращает [''].

Если sep не указан или равен None, , то используется другой алгоритм расщепления применяется: пробеги последовательных пробелов рассматриваются как один разделитель, и результат не будет содержать пустых строк в начале или конец, если строка имеет начальный или конечный пробел . Как следствие, разбиение пустой строки или строки, состоящей только из пробелов с разделителем None возвращает [].

Python пытается сделать то, что вы ожидаете. Большинство людей, не думающих слишком усердно, вероятно, ожидают

'1 2 3 4 '.split() 

чтобы вернуть

['1', '2', '3', '4']

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

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

Когда дело доходит до алгоритма, используемого при указании разделителя, подумайте о строке в файле CSV:

1,,3

означает, что в 1-м и 3-м столбцах есть данные, а во втором нет данных, поэтому вы бы хотели

'1,,3'.split(',')

чтобы вернуть

['1', '', '3']

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

...