2012-01-19 8 views
21

Ho uno stringa da cui voglio estrarre 3 gruppi:corrispondenza solo una lettera unicode in Python ri

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

nome mese potrebbe contenere caratteri non ASCII, in modo da [A-Za-z] non funziona per me:

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

potevo usare \w ma partite cifre e underscore:

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

Ho cercato di usare [:alpha:], ma non funziona:

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

Se potessi in qualche modo corrispondere \w senza [_0-9], ma non so come. E anche se scopro come farlo, c'è una scorciatoia pronta come [:alpha:] che funziona in Python?

+1

Per quanto riguarda '[: alpha:]', funziona solo all'interno di una classe di caratteri, quindi la regex corretta sarebbe '[[: alpha:]] +', ma Python non li supporta comunque. –

+0

Perché non chiamare semplicemente .split() sulla stringa? – yak

risposta

42

si può costruire una nuova classe di caratteri:

[^\W\d_] 

invece di \w. Tradotto in inglese, significa "Qualsiasi carattere che non sia un carattere non alfanumerico ([^\W] è uguale a \w), ma non è nemmeno una cifra e non un trattino basso".

Pertanto, consente solo lettere Unicode (se si utilizza l'opzione di compilazione re.UNICODE).

+0

Ho già riconosciuto che '\ p {L}' non è supportato, quindi la soluzione è la strada da fare +1. – stema

+1

Ottima soluzione !!! Avere una domanda. Cosa succede se voglio consentire meno segno (-). –

+0

per includere '' -'' in qualsiasi classe di caratteri regex, basta metterla alla fine (o all'inizio): '' [^ \ W \ d _-] '' per questo esempio. – RichVel

Problemi correlati