22

He leído a través de las otras preguntas en Stackoverflow, pero aún no estoy más cerca. Lo siento, si esto ya está respondido, pero no conseguí nada propuesto para trabajar allí.caracteres Unicode coincidentes en expresiones regulares de Python

>>> import re 
>>> m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/xmas/xmas1.jpg') 
>>> print m.groupdict() 
{'tag': 'xmas', 'filename': 'xmas1.jpg'} 

Todo está bien, entonces intento algo con caracteres noruegos en ella (o algo más parecido Unicode):

>>> m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/påske/øyfjell.jpg') 
>>> print m.groupdict() 
Traceback (most recent call last): 
File "<interactive input>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'groupdict' 

¿Cómo se puede hacer coincidir caracteres Unicode típicos, como øæå? Me gustaría poder hacer coincidir esos caracteres también, tanto en el grupo de etiquetas anterior como en el nombre del archivo.

+0

asegúrese de que [Normalizar] (https: //docs.python.org/2/library/unicodedata.html#unicodedata.normalize) tus cadenas porque hay secuencias de puntos de código diferentes que generan la misma apariencia visual. – janbrohl

Respuesta

38

Es necesario especificar la bandera re.UNICODE, y entrada de la cadena como una cadena Unicode utilizando la u prefijo:

>>> re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', u'/by_tag/påske/øyfjell.jpg', re.UNICODE).groupdict() 
{'tag': u'p\xe5ske', 'filename': u'\xf8yfjell.jpg'} 

Este es en Python 2; en Python 3 debe omitir el u porque todas las cadenas son Unicode.

+1

+1 para: e ingrese su cadena como una cadena Unicode usando el prefijo u – Tamm

9

Se necesita el UNICODE bandera:

m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/påske/øyfjell.jpg', re.UNICODE) 
+2

¿Es necesario para Python3 también? – Kevin

5

En Python 2, es necesario la bandera re.UNICODE y el constructor unicode cadena

>>> re.sub(r"[\w]+","___",unicode(",./hello-=+","utf-8"),flags=re.UNICODE) 
u',./___-=+' 
>>> re.sub(r"[\w]+","___",unicode(",./cześć-=+","utf-8"),flags=re.UNICODE) 
u',./___-=+' 
>>> re.sub(r"[\w]+","___",unicode(",./привет-=+","utf-8"),flags=re.UNICODE) 
u',./___-=+' 
>>> re.sub(r"[\w]+","___",unicode(",./你好-=+","utf-8"),flags=re.UNICODE) 
u',./___-=+' 
>>> re.sub(r"[\w]+","___",unicode(",./你好,世界-=+","utf-8"),flags=re.UNICODE) 
u',./___\uff0c___-=+' 
>>> print re.sub(r"[\w]+","___",unicode(",./你好,世界-=+","utf-8"),flags=re.UNICODE) 
,./___,___-=+ 

(En este último caso, la coma es comas chino.)

Cuestiones relacionadas