Python:使用带有重音字符的正则表达式和标记(负向观察)

时间:2018-05-12 13:15:52

标签: python regex python-unicode

我需要检测西班牙语中的大写单词,但只有当它们不在一个令牌之前,它才能有unicode字符。 (我在linux中使用Python 2.7.12)。

这项工作正常(非unicode令牌[例如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)'风格,而不是'python' flavor,因为由于某种原因,第一个似乎给出的结果更类似于命令行正则表达式的结果包中的python)。

是否由于我正在使用的python版本:2.7.12而不是python 3? 我很可能误解了一些事情。提前感谢任何方向。

经过大量的错误和奇怪的结果,我逐渐意识到:

  • regex套餐是最佳选择,而不是re因为更好 unicode支持(例如,提供上层和上层的区别) 小写unicode字符)。

  • 必须设置regex.U标志。 (regex.X只是为了清晰起见而允许空格和注释)

  • u'' unicode字符串和r''原始字符串可以同时合并:ur''

  • \p{Lu}\p{Ll}分别匹配unicode大写和小写字符。

0 个答案:

没有答案