Чтобы разделить строки на пробелы в 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
.