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