2008-12-26 13 views
68

tengo que borrar algunos caracteres Unicode de la cadena 'بسم الله الرحمن الرحيم'Python y la expresión regular con Unicode

sé que existen aquí seguro. Intenté:

re.sub('([\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+)', '', 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ') 

pero no funciona. La cadena permanece igual. ¿Qué estoy haciendo mal?

Respuesta

87

¿Está utilizando python 2.xo 3.0?

Si está utilizando 2.x, trate de hacer la cadena de expresión regular una cadena Unicode de escape, la 'U'. Como es regex, es una buena práctica hacer que su cadena de expresiones regulares sea una cadena sin formato, con 'r'. Además, poner su patrón completo entre paréntesis es superfluo.

re.sub(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', '', ...) 

http://docs.python.org/tutorial/introduction.html#unicode-strings

Editar:

También es una buena práctica usar la bandera re.UNICODE/re.U/expresiones regulares para Unicode, pero sólo afecta a los alias de clase de caracteres como (u?) \ w o \ b, de los cuales este patrón no usa ninguno y por lo tanto no se vería afectado por.

+9

Hmm, no sabe que podría concatenar tanto '' '' u'' y prefijos r''. ¡Eso es muy bonito! –

58

Uso unicode cuerdas. Use la bandera re.UNICODE.

>>> myre = re.compile(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', 
         re.UNICODE) 
>>> myre 
<_sre.SRE_Pattern object at 0xb20b378> 
>>> mystr = u'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ' 
>>> result = myre.sub('', mystr) 
>>> len(mystr), len(result) 
(38, 22) 
>>> print result 
بسم الله الرحمن الرحيم 

Leer el artículo de Joel Spolsky llamada The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

+8

el artículo es impresionante – Fluffy

+0

@nosklo, ¿por qué las llaves que establece el número de caracteres - {5} - no está trabajando con caracteres Unicode, Estoy teniendo problemas con él, sin embargo, el + funciona fine..do tienes alguna idea? ¡Gracias! – securecurve

+0

@securecurve No tengo idea, y sin mi bola de cristal mágica no hay forma de ayudar. Acabo de probarlo, y funciona bien para mí. Si no funciona para usted, le sugiero que haga una nueva pregunta, proporcionando ** su código ** y el resultado que está obteniendo. – nosklo

Cuestiones relacionadas