[Python-es] Convertir utf8 a html entities
Chema Cortes
pych3m4 en gmail.com
Mar Jun 5 19:40:47 CEST 2012
El día 5 de junio de 2012 15:59, Rock Neurotiko
<miguelglafuente en gmail.com> escribió:
> Yo creo que no hay que darle muchas vueltas al tema, puede que escrito quede
> más "bonito", pero la expresion regular, dentro de lo que cabe, seguirá
> recorriendo todo el string, incluso lo tendras que recorrer mas veces, una
> por cada substitución.
> Van a ser de la misma complejidad, O(n), o incluso la de expresiones
> regulares seria O(k*n).
No estoy de acuerdo. Muchas librerías, como la de las expresiones
regulares, se programan y optimizan en C con lo que su uso puede
resultar muy eficiente. Pero en el caso concreto de las expresiones
regulares, se pueden combinar todos los caracteres a buscar en una
sóla cadena de búsqueda con lo que sólo recorrer la cadena una sóla
vez:
import re
from htmlentitydefs import codepoint2name
u2n=dict((unichr(k),v) for (k,v) in codepoint2name.items())
pat=re.compile('['+"".join(u2n.keys())+']')
def repl(m):
return '&'+u2n[m.group(0)]+';'
print( pat.sub(repl, u"áÁ éÉ íÍ óÓ úÚ ñÑ çÇ €") )
Este uso muestra muy poco del potencial que tienen las expresiones
regulares. Para el caso que nos ocupa, posiblemente existan otras
soluciones más rápidas y elegantes de hacer lo mismo, o incluso tan
crípticas como ésta:
print( "".join( ('&'+u2n[c]+';') if ord(c) in u2n else c for c in
u""áÁ éÉ íÍ óÓ úÚ ñÑ çÇ €") )
...que viene a ser una solución "compacta" de las ya propuestas en
mensajes anteriores.
--
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales
Más información sobre la lista de distribución Python-es