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

Для разделения строк пробелами в 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']

А если вам этого недостаточно, добавьте символы один за другим, как Габи Пуркару предлагает ниже.

27
задан Community 23 May 2017 в 11:45
поделиться

1 ответ

Редактировать

Оказывается, что \ 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)
17
ответ дан 28 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: