仅匹配 Python re 中的 unicode 字母

Posted

技术标签:

【中文标题】仅匹配 Python re 中的 unicode 字母【英文标题】:Matching only a unicode letter in Python re 【发布时间】:2012-02-13 23:42:28 【问题描述】:

我有一个字符串,我想从中提取 3 个组:

'19 janvier 2012' -> '19', 'janvier', '2012'

月份名称可以包含非 ASCII 字符,所以 [A-Za-z] 对我不起作用:

>>> import re
>>> re.search(ur'(\d,2) ([A-Za-z]+) (\d4)', u'20 janvier 2012', re.UNICODE).groups()
(u'20', u'janvier', u'2012')
>>> re.search(ur'(\d,2) ([A-Za-z]+) (\d4)', u'20 février 2012', re.UNICODE).groups()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
>>> 

我可以使用\w,但它匹配数字和下划线:

>>> re.search(ur'(\w+)', u'février', re.UNICODE).groups()
(u'f\xe9vrier',)
>>> re.search(ur'(\w+)', u'fé_q23vrier', re.UNICODE).groups()
(u'f\xe9_q23vrier',)
>>> 

我尝试使用[:alpha:],但它不起作用:

>>> re.search(ur'[:alpha:]+', u'février', re.UNICODE).groups()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
>>> 

如果我可以在没有[_0-9] 的情况下以某种方式匹配\w,但我不知道如何。即使我知道如何做到这一点,是否有像 [:alpha:] 这样的现成快捷方式可以在 Python 中使用?

【问题讨论】:

至于[:alpha:],这只适用于字符类,所以正确的正则表达式应该是[[:alpha:]]+,但Python无论如何都不支持这些。 为什么不简单地在字符串上调用 .split()? 【参考方案1】:

你可以构造一个新的字符类:

[^\W\d_]

而不是\w。翻译成英文,它的意思是“任何不是非字母数字字符的字符([^\W]\w 相同),但它也不是数字,也不是下划线”。

因此,它将只允许 Unicode 字母(如果您使用 re.UNICODE 编译选项)。

【讨论】:

我已经认识到 \pL 不受支持,因此您的解决方案是 +1 的方式。 要在任何正则表达式字符类中包含-,只需将其放在末尾(或开头):此示例中为[^\W\d_-] @RichVel:那将禁止减号。 @TimPietzcker - 是的,我没有很好地阅读该评论......一种解决方案是使用正则表达式交替,例如像这样的东西(未经测试):([^\W\d_]|-)

以上是关于仅匹配 Python re 中的 unicode 字母的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中仅匹配 Unicode 字符串中的完全组合字符?

Python正则re.S,re.I等作用

python re

python re模块

python re模块

Python之re模块 —— 正则表达式操作