У меня есть строка, из которой я хочу извлечь 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 "", line 1, in
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 "", line 1, in
AttributeError: 'NoneType' object has no attribute 'groups'
>>>
Если бы я мог каким-то образом сопоставить \ w
без [_ 0-9]
, но я не знаю как. И даже если я узнаю, как это сделать, есть ли готовый ярлык вроде [: alpha:]
, который работает в Python?
Вы можете создать новый класс персонажей:
[^\W\d_]
вместо \w
. В переводе на английский это означает «Любой символ, который не является буквенно-цифровым символом ([^\W]
совпадает с \w
), но также не является цифрой и не подчеркиванием».
Следовательно, он будет разрешать только буквы Юникода (если вы используете опцию компиляции re.UNICODE
).