Соответствует только букве Unicode в Python - PullRequest
24 голосов
/ 19 января 2012

У меня есть строка, из которой я хочу извлечь 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], но я не знаю как. И даже если я узнаю, как это сделать, есть ли готовый ярлык, такой как [:alpha:], который работает в Python?

1 Ответ

48 голосов
/ 19 января 2012

Вы можете создать новый класс символов:

[^\W\d_]

вместо \w.В переводе на английский это означает «Любой символ, который не является буквенно-цифровым символом ([^\W] совпадает с \w), но также не является цифрой и не подчеркиванием».

Поэтому разрешены только буквы Юникода (если вы используете опцию re.UNICODE compile).

...