Для разделения строк пробелами в python обычно используется метод split
строки без параметров:
>>> 'a\tb c\nd'.split()
['a', 'b', 'c', 'd']
Но вчера я наткнулся на строку, в которой также использовалось ZERO WIDTH SPACE между словами. Превратив свои новые знания в короткое представление черной магии (среди людей, использующих JavaScript), я хотел бы спросить, как лучше разбить все пробельные символы , поскольку разбивает
недостаточно:
>>> u'a\u200bc d'.split()
[u'a\u200bc', u'd']
UPD1
кажется, что решение, предложенное sth
, в целом работает, но зависит от некоторых настроек ОС или параметров компиляции Python. Было бы неплохо знать причину точно (и можно ли включить эту настройку в Windows).
UPD2
cptphil
нашел отличную ссылку , которая проясняет все:
Я связался с техническим комитетом Unicode по поводу этой проблемы и получил незамедлительный ответ. Они указали, что ZWSP когда-то считался пробелом, но это было изменено в Unicode 4.0.1
Цитата из сайта Unicode :
Изменение U + 200B пространства нулевой ширины с Zs to Cf (2003.10.27)
Постоянно возникали проблемы с использованием пространства нулевой ширины U + 200B (ZWSP).Функция этого символа состоит в том, чтобы разрешить разрыв строки в позициях, где он обычно не разрешен, и, таким образом, функционально является символом форматирования с общей категорией Cf. Это поведение хорошо задокументировано в стандарте Unicode, и символ не считается символом пробела в базе данных символов Unicode. Однако по историческим причинам общей категорией по-прежнему является Zs (разделитель пробелов), что приводит к неправильному использованию персонажа. ZWSP также является единственным символом Zs, который не является пробелом. Общая категория может привести к неправильной интерпретации правила D13 «Базовый символ» как допускающего 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
.
Для других пробелов достаточно обычного разделения
:
>>> u'a\u200Ac'.split()
[u'a', u'c']
А если вам этого недостаточно, добавьте символы один за другим, как Габи Пуркару
предлагает ниже.
Редактировать
Оказывается, что \ u200b технически не определяется как пробел, и поэтому python не распознает его как совпадающий \ s даже с включенным флагом Юникода. Таким образом, он должен рассматриваться как непробельный символ.
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)