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

2024-04-25 19:36:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要检测西班牙语中的大写单词,但前提是它们前面没有标记,标记可以包含unicode字符。(我在linux中使用python2.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中的命令行regex包)。你知道吗

这是因为我使用的是python版本:2.7.12而不是python3吗?。 很可能我误解了什么。提前谢谢你的指点。你知道吗

在经历了很多错误和奇怪的结果之后,我逐渐意识到:

  • regex包是一个不错的选择,而不是re,因为它有更好的 unicode支持(例如,提供了对大写和小写的区分 小写unicode字符)。

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

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

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


Tags: 标记unicodegui字符elregexprintll