Python re 中只匹配 Unicode 字母

33

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

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

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

>>> import re
>>> re.search(ur'(\d{,2}) ([A-Za-z]+) (\d{4})', u'20 janvier 2012', re.UNICODE).groups()
(u'20', u'janvier', u'2012')
>>> re.search(ur'(\d{,2}) ([A-Za-z]+) (\d{4})', 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'
>>> 

我希望能够匹配\w但不包括[_0-9],但我不知道该如何实现。即使我找到了方法,是否有像Python中的[:alpha:]这样的快捷方式?


1
关于[:alpha:],它只能在字符类内部使用,因此正确的正则表达式应该是[[:alpha:]]+,但Python无法支持这些。 - Tim Pietzcker
为什么不直接在字符串上调用 .split() 方法呢? - yak
FYI,\w已经匹配Unicode字符,参见“Unicode(str)模式”: 匹配Unicode单词字符;这包括任何语言中可以作为单词的大多数字符,以及数字和下划线。如果使用了ASCII标志,则只匹配[a-zA-Z0-9_]。 参考https://docs.python.org/3/library/re.html,尽管我不知道是否需要使用 re.UNICODE 标志。 - Charlie Parker
我们真的需要re.UNICODE标志吗?文档似乎暗示它已经适用于Unicode:要搜索的模式和字符串都可以是Unicode字符串(str)以及8位字符串(bytes)。如果我错了,请纠正我。参考:https://docs.python.org/3/library/re.html - Charlie Parker
@CharlieParker 可能是在 Python 2 时代提出的问题。 - warvariuc
1个回答

64

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

[^\W\d_]

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

因此,它只允许Unicode字母。


2
我已经意识到\p{L}不被支持,所以你的解决方案是正确的 +1。 - stema
要在任何正则表达式字符类中包含“-”,只需将其放在末尾(或开头):[^\W\d_-] 以此为例。 - RichVel
3
@RichVel:这将禁止使用减号。 - Tim Pietzcker
2
@TimPietzcker - 是的,我没有好好阅读那个评论... 一个解决方案是使用正则表达式的替代,例如像这样(未经测试): ([^\W\d_]|-) - RichVel
我们真的需要re.UNICODE标志吗?文档似乎暗示它已经适用于Unicode:要搜索的模式和字符串都可以是Unicode字符串(str)以及8位字符串(bytes)。如果我错了,请纠正我。参考:https://docs.python.org/3/library/re.html - Charlie Parker
你是正确的,在Python 3中这是多余的。在回答写下的2012年,Python 2仍然是主流,但现在应该需要进行编辑。 - Tim Pietzcker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接