Подтвердить что ты не робот

Python: разделение строки на все символы пробела

Чтобы разделить строки на пробелы в python, обычно используется метод split для строки без параметров:

>>> 'a\tb c\nd'.split()
['a', 'b', 'c', 'd']

Но вчера я наткнулся на строку, которая использовала ZERO WIDTH SPACE между словами. Перевернув мои новые знания в короткой черной магии (среди пользователей JavaScript), я хотел бы спросить, как лучше разделить все пробельные символы, так как split недостаточно:

>>> u'a\u200bc d'.split()
[u'a\u200bc', u'd']

UPD1

кажется, что решение, предлагаемое sth, выполняется gererally, но зависит от некоторых настроек ОС или параметров компиляции Python. Было бы неплохо узнать причину (и если настройка может быть включена в Windows).

UPD2 cptphil нашел отличную ссылку , которая делает все понятным:

Поэтому я связался с Техническим комитетом Юникода по этой проблеме и получил оперативно полученный ответ. Они указали, что ZWSP когда-то считался белым пространством, но это было изменено в Unicode 4.0.1

Цитата из сайт юникода:

Изменение U + 200B Zero Width Space от Zs до Cf (2003.10.27)

Имеются постоянные проблемы с использованием U Zoo 200B Zero Width Space (ZWSP). Функция этого символа состоит в том, чтобы разрешить разрыв строки в положениях, где она обычно не допускается, и, таким образом, функционально является символом формата с общей категорией Cf. Это поведение хорошо документировано в стандарте Unicode, а символ не считается символом пробела в базе данных символов Юникода. Однако по историческим причинам общая категория по-прежнему занимает Zs (Space Separator), что приводит к злоупотреблению персонажем. ZWSP также является единственным символом Zs, который не является пробелом. Общая категория может вызвать неправильное толкование правила D13 Base, что позволяет ZWSP как базу для объединения меток.

Предложение состоит в том, чтобы изменить общую категорию U + 200B от Zs до Cf.

Разрешение: закрыто. Общая категория U + 200B будет изменена с Zs на Cf в Unicode версии 4.0.1.

Затем изменение было отражено в Python. Результат u'\u200B'.isspace() в Python 2.5.4 и 2.6.5 равен True, в Python 2.7.1 он уже False.

Для других пробелов достаточно регулярных split:

>>> u'a\u200Ac'.split()
[u'a', u'c']

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

4b9b3361

Ответ 1

Edit

Оказывается, что технически не определено как пробел, и поэтому python не распознает его как соответствие \s даже с флагом unicode. Поэтому он должен рассматриваться как символ без пробелов.

http://en.wikipedia.org/wiki/Whitespace_character#Unicode

http://bugs.python.org/issue13391

import re

re.split(ur"[\u200b\s]+", "some string", flags=re.UNICODE)

Ответ 2

Вы можете использовать регулярное выражение с включенным Unicode-соответствием:

>>> re.split(r'(?u)\s', u'a\u200bc d')
[u'a', u'c', u'd']

Ответ 3

Вы можете использовать re.split, например:

import re
re.split(u'\s|\u200b', your_string)

Ответ 5

Можете ли вы использовать что-то вроде этого?

re.split(r'\s+', your_string, re.UNICODE)

Ответ 6

Просто используйте split:

>>> u'\u200b'.isspace()
True