使用正则表达式的Unicode正则表达式不适用于Python

时间:2015-08-16 19:27:40

标签: python regex unicode

我有以下正则表达式(see it in action in PCRE

.*?\P{L}*?(\p{L}+-?(\p{L}+)?)\P{L}*$

但是,Python不支持使用\p{}语法的unicode正则表达式。要解决此问题I read,我可以使用regex模块(不是默认re),但这似乎也不起作用。甚至没有u标志。

示例:

sentence = "valt nog zoveel zal kunnen zeggen, "

print(re.sub(".*?\P{L}*?(\p{L}+-?(\p{L}+)?)\P{L}*$","\1",sentence))
  • 输出:<空白>
  • 预期输出:zeggen

这不适用于Python 3.4.3。

2 个答案:

答案 0 :(得分:3)

正如您所见,re模块中没有.numberBoxes { }这样的unicode字符类。但是,这并不意味着您无法使用re模块执行此操作,因为\p{L}可以使用\p{L}标记替换为[^\W\d_](即使存在小标记)这两个字符类之间的差异,请参阅注释中的链接)。

第二点,你的方法不是好的方法(如果我理解得很好,你试图提取每一行的最后一个单词),因为你奇怪地决定删除所有不是最后一个单词(除了换行符)有一个替代品。 〜52000步骤提取10行文本中的10个单词是不可接受的(并且会因更多字符而崩溃)。更有效的方法是查找所有最后的单词,请参阅此示例:

UNICODE

通知:

  • 要使用python 2.7获得相同的结果,您只需要在字符串的单引号前添加import re s = '''Ik heb nog nooit een kat gezien zo lélijk! Het is een minder lelijk dan uw hond.''' p = re.compile(r'^.*\b(?<!-)(\w+(?:-\w+)*)', re.M | re.U) words = p.findall(s) print('\n'.join(words)) u

  • 如果您绝对希望将结果限制为避免数字和下划线的字母,请在模式中将s = u'''...替换为\w

  • 如果使用正则表达式模块,也许字符类[^\W\d_]更适合您的使用,或者您选择的任何模块,更明确的类只包含所需的字符,例如: \p{IsLatin}

  • 您可以使用此模式对正则表达式模块实现相同的目标:
    [A-Za-záéóú...

其他方式:

与re模块一致:

p = regex.compile(r'^.*\m(?<!-)(\pL+(?:-\pL+)*)', regex.M | regex.U)

使用正则表达式模块,您可以利用反向搜索:

p = re.compile(r'[^\w-]+', re.U)
for line in s.split('\n'):
    print(p.split(line+' ')[-2])

答案 1 :(得分:-1)

这篇文章解释了如何在python中使用unicode属性:

Python regex matching Unicode properties

  

你有没有试过Ponyguruma,一个绑定到Oniguruma的Python   正则表达引擎?在那个引擎中你可以简单地说   \p{Armenian}匹配亚美尼亚字符。 \p{Ll}\p{Zs}工作   太

相关问题