31

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で機能するような準備が整ったショートカットはありますか?

4

1 に答える 1

61

新しい文字クラスを作成できます。

[^\W\d_]

の代わりに\w。英語に翻訳すると、「英数字以外の文字([^\W]と同じ\w)ではないが、数字でもアンダースコアでもない文字」を意味します。

したがって、Unicode文字のみが許可されます(re.UNICODEコンパイルオプションを使用する場合)。

于 2012-01-19T09:52:59.220 に答える