Python: использование регулярных выражений и токенов с акцентированными символами (негативный взгляд сзади) - PullRequest
0 голосов
/ 12 мая 2018

Мне нужно определять заглавные слова на испанском языке, но только если им не предшествует токен, который может иметь символы в юникоде.(Я использую Python 2.7.12 в Linux).

Это работает нормально (токен не в юникоде [например, guion:]

>>> import regex
>>> s = u"guion: El computador. Ángel."
>>> p = regex.compile( r'(?<!guion:\s) ( [\p{Lu}] [\p{Ll}]+ \b)' , regex.U | regex.X)
>>> print p.sub( r"**\1**", s)
    guion: El computador. **Ángel**.

Но по той же логике не обнаруживаются акцентированные токены [например, guión:]:

>>> s = u"guión: El computador. Ángel."
>>> p = regex.compile( ur'(?<!guión:\s) ( [\p{Lu}] [\p{Ll}]+ \b)' , regex.U | regex.X)
>>> print p.sub( r"**\1**", s)
guión: **El** computador. **Ángel**.

Ожидаемый результат будет:

guión: El computador. **Ángel**.

В regex101 код работает нормально (в 'pcr (php)'flavor вместо 'python' flavor , поскольку первый, по некоторым причинам, дает результаты, более похожие на результаты пакета регулярных выражений командной строки в python).

Это связано с питономЯ использую версию: 2.7.12 вместо python 3. Скорее всего, я что-то недопонимаю. Заранее спасибо за любые указания.

После множества ошибок и странных результатов я пришел кПоймите, что:

  • Пакет regex - это путь, вместо re из-за лучшей поддержки юникода (например, обеспечивает разграничение символов верхнего и нижнего регистров Юникода).

  • Необходимо установить флаг regex.U. (regex.X позволяет только пробелы и начальныеради ясности)

  • u'' строки Unicode и r'' необработанные строки можно комбинировать одновременно: ur''

  • \p{Lu} и \p{Ll} соответствуют символам в верхнем и нижнем регистре Юникода соответственно.

...