Мне нужно определять заглавные слова на испанском языке, но только если им не предшествует токен, который может иметь символы в юникоде.(Я использую 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}
соответствуют символам в верхнем и нижнем регистре Юникода соответственно.