2012-01-19 18 views
21

Mam ciąg, z którego chcę wyodrębnić 3 grupy:Matching tylko list Unicode w Pythonie ponownie

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

nazwa miesiąca mógłby zawierają znaki spoza ASCII, więc [A-Za-z] nie działa dla mnie:

>>> 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' 
>>> 

mogę użyć \w ale pasuje cyfry i podkreślenia:

>>> 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',) 
>>> 

Próbowałem użyć [:alpha:], ale to nie działa:

>>> 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' 
>>> 

Gdybym mógł jakoś dopasować \w bez [_0-9], ale nie wiem jak. A nawet jeśli dowiem się, jak to zrobić, czy jest gotowy skrót, taki jak [:alpha:], który działa w języku Python?

+1

Jeśli chodzi o '[: alfa:]', działa to tylko wewnątrz klasy znaków, więc poprawnym wyrażeń regularnych będzie '[[: alpha:]] +', ale Python i tak ich nie obsługuje. –

+0

Dlaczego nie po prostu wywołać .split() w ciągu znaków? – yak

Odpowiedz

42

Można skonstruować nową klasę postaci:

[^\W\d_] 

zamiast \w. Przetłumaczone na język angielski, oznacza "Dowolny znak, który nie jest alfanumeryczny ([^\W] jest taki sam jak \w), ale to także nie jest cyfra, a nie podkreślenie".

Dlatego zezwala tylko na litery Unicode (jeśli używasz opcji kompilacji re.UNICODE).

+0

Już rozpoznałem, że '\ p {L}' nie jest obsługiwane, więc twoje rozwiązanie jest sposobem na +1. – stema

+1

Bardzo dobre rozwiązanie !!! Mam pytanie. Co jeśli chcę zezwolić na znak minus (-). –

+0

do włączenia '' -'' w dowolnej klasie znaku regex, wystarczy umieścić ją na końcu (lub na początku): '' [^ \ W \ d _-] '' dla tego przykładu. – RichVel