Чтобы соответствовать границам слов Юникода [как определено в Приложение № 29] в Python, я использовал пакет regex
с флагами regex.WORD | regex.V1
(regex.UNICODE
должен быть по умолчанию, так как шаблон является строкой Unicode) следующим образом:
>>> s="here are some words"
>>> regex.findall(r'\w(?:\B\S)*', s, flags = regex.V1 | regex.WORD)
['here', 'are', 'some', 'words']
Хорошо работает в этих довольно простых случаях. Тем не менее, мне было интересно, каково ожидаемое поведение, если строка ввода содержит определенную пунктуацию. Мне кажется, что WB7 говорит, что, например, апостроф в x'z
не квалифицируется как граница слова, которая, по-видимому, действительно имеет место:
>>> regex.findall(r'\w(?:\B\S)*', "x'z", flags = regex.V1 | regex.WORD)
["x'z"]
Однако, если есть гласная, ситуация меняется:
>>> regex.findall(r'\w(?:\B\S)*', "l'avion", flags = regex.V1 | regex.WORD)
["l'", 'avion']
Это предполагает, что модуль regex реализует правило WB5a
, указанное в стандарте в разделе "Примечания". Однако это правило также говорит о том, что поведение должно быть одинаковым с \u2019
(правая одинарная кавычка), которую я не могу воспроизвести:
>>> regex.findall(r'\w(?:\B\S)*', "l\u2019avion", flags = regex.V1 | regex.WORD)
['l’avion']
Более того, даже при "нормальном" апострофе лигатура (или y
), по-видимому, ведет себя как "негласная":
>>> regex.findall(r'\w(?:\B\S)*', "l'œil", flags = regex.V1 | regex.WORD)
["l'œil"]
>>> regex.findall(r'\w(?:\B\S)*', "J'y suis", flags = regex.V1 | regex.WORD)
["J'y", 'suis']
Является ли это ожидаемым поведением? (все приведенные выше примеры выполнялись с регулярным выражением 2.4.106 и Python 3.5.2)