Согласование границ слова Unicode в Python

Чтобы соответствовать границам слов Юникода [как определено в Приложении № 29 ] в Python, я использовал пакет regex с флагами regex.WORD | regex.V1 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)

One Solution collect form web for “Согласование границ слова Unicode в Python”

1- RIGHT SINGLE QUOTATION MARK ' кажется, просто пропущен в исходном файле :

 /* Break between apostrophe and vowels (French, Italian). */ /* WB5a */ if (pos_m1 >= 0 && char_at(state->text, pos_m1) == '\'' && is_unicode_vowel(char_at(state->text, text_pos))) return TRUE; 

2- is_unicode_vowel() Юникода определяются с is_unicode_vowel() функции is_unicode_vowel() которая переводится в этот список:

 a, à, á, â, e, è, é, ê, i, ì, í, î, o, ò, ó, ô, u, ù, ú, û 

Таким образом, символ LATIN SMALL LIGATURE OE œ не считается гласным в виде юникода:

 Py_LOCAL_INLINE(BOOL) is_unicode_vowel(Py_UCS4 ch) { #if PY_VERSION_HEX >= 0x03030000 switch (Py_UNICODE_TOLOWER(ch)) { #else switch (Py_UNICODE_TOLOWER((Py_UNICODE)ch)) { #endif case 'a': case 0xE0: case 0xE1: case 0xE2: case 'e': case 0xE8: case 0xE9: case 0xEA: case 'i': case 0xEC: case 0xED: case 0xEE: case 'o': case 0xF2: case 0xF3: case 0xF4: case 'u': case 0xF9: case 0xFA: case 0xFB: return TRUE; default: return FALSE; } } 

Эта ошибка теперь исправлена ​​в regex 2016.08.27 после отчета об ошибке . [ _regex.c: # 1668 ]

  • Удалить символы с подчеркнутыми символами - Python
  • Как преобразовать некоторый символ в пятизначный unicode в Python 3.3?
  • Является ли это лучшим способом обеспечения кодирования «string» юникода python в utf-8?
  • Как заставить интерпретатор python правильно обрабатывать символы, отличные от ASCII, в строковых операциях?
  • UnicodeDecodeError: кодек ascii не может декодировать байт 0xef в позиции 1
  • Разница Python между print obj и print obj .__ str __ ()
  • Как заставить str.translate работать с строками Unicode?
  • Python 3 smtplib отправляет с символами unicode
  • Как сделать surrogateescape в python2
  • Python NLTK: SyntaxError: не-ASCII-символ '\ xc3' в файле (анализ сглаживания -NLP)
  • Чтение символов Юникода из аргументов командной строки в Python 2.x в Windows
  • Python - лучший язык программирования в мире.