我有以下正则表达式(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。
答案 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}
工作 太