Python y expresión regular con Unicode

83

Necesito eliminar algunos símbolos Unicode de la cadena 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ'

Sé que existen aquí con seguridad. Lo intenté:

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

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

bsn
fuente

Respuestas:

110

¿Está usando python 2.xo 3.0?

Si está utilizando 2.x, intente convertir la cadena de expresiones regulares en una cadena de escape unicode, con 'u'. Dado que es una expresión regular, es una buena práctica hacer que su cadena de expresiones regulares sea una cadena sin formato, con 'r'. Además, poner todo su patrón 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 el indicador re.UNICODE / re.U / (? U) para expresiones regulares Unicode, pero solo afecta a los alias de clases de caracteres como \ w o \ b, de los cuales este patrón no usa ninguno y, por lo tanto, no lo haría. ser afectado por.

ʞɔıu
fuente
15
Hmm, no sabía que se podían concatenar ambos prefijos uy r. ¡Eso es muy bonito!
Balthazar Rouberol
6
@BalthazarRouberol obtengo SyntaxError: invalid syntax en Python 3.6
Umair Ayub
75

Utilice cadenas unicode . Utilice 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
بسم الله الرحمن الرحيم

Lea el artículo de Joel Spolsky titulado El mínimo absoluto que todo desarrollador de software debe conocer absoluta y positivamente sobre Unicode y los conjuntos de caracteres (¡sin excusas!)

nosklo
fuente
11
el artículo es impresionante
Fluffy
@nosklo, ¿por qué las llaves que establecen el número de caracteres - {5} - no funcionan con caracteres Unicode? Tengo problemas con eso, sin embargo, + funciona bien ... ¿tienes alguna idea? ¡Gracias!
securecurve
@securecurve No tengo ni idea, y sin mi bola de cristal mágica no hay forma de ayudar. Lo acabo de probar 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
4
En caso de que desee usarlo reen Python, debe saber que no admite la propiedad de caracteres Unicode (como \p{L}). pypi.python.org/pypi/regex lo hace.
ruidoso
re.UNICODEbandera es inútil aquí, ya que sólo afecta a las clases de caracteres de la taquigrafía \w, \d, \s.
nhahtdh