2012-01-19 12 views
21

que tienen una cadena de la que quiero extraer 3 grupos:de búsqueda sólo una letra Unicode en Python re

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

Nombre del mes podría contener caracteres no ASCII, por lo [A-Za-z] no funciona para mí:

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

que podría utilizar \w pero coincide con los dígitos y guión:

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

He intentado utilizar [:alpha:], pero que no está funcionando:

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

Si de alguna manera podría coincidir \w sin [_0-9], pero no saben cómo. E incluso si descubro cómo hacerlo, ¿hay un atajo listo como [:alpha:] que funcione en Python?

+1

En cuanto a '[: alpha:]', esto solo funciona dentro de una clase de caracteres, por lo que la expresión regular correcta sería '[[: alpha:]] +', pero Python no los admite de todos modos. –

+0

¿Por qué no simplemente llamar a .split() en la cadena? – yak

Respuesta

42

Usted puede construir una nueva clase de caracteres:

[^\W\d_] 

en lugar de \w. Traducido al inglés, significa "Cualquier carácter que no sea un carácter no alfanumérico ([^\W] es lo mismo que \w), pero tampoco es un dígito ni un guión bajo".

Por lo tanto, solo permitirá letras Unicode (si usa la opción de compilación re.UNICODE).

+0

Ya reconocí que '\ p {L}' no es compatible, por lo que su solución es el camino a seguir +1. – stema

+1

¡Muy buena solución! Tengo una pregunta. ¿Qué ocurre si quiero permitir el signo menos (-)? –

+0

para incluir '' -'' en cualquier clase de caracteres regex, simplemente póngalo al final (o al comienzo): '' [^ \ W \ d _-] '' para este ejemplo. – RichVel

Cuestiones relacionadas