¿Cómo buscar y reemplazar los caracteres especiales de utf-8 en Python?

Soy un principiante de Python, y tengo un problema con utf-8.

Tengo una cadena de caracteres utf-8 y me gustaría reemplazar todas las diéresis alemanas con reemplazos ASCII (en alemán, u-umlaut ‘ü’ puede reescribirse como ‘ue’).

u-umlaut tiene un punto de código Unicode 252, así que intenté esto:

>>> str = unichr(252) + 'ber' >>> print repr(str) u'\xfcber' >>> print repr(str).replace(unichr(252), 'ue') u'\xfcber' 

Esperaba que la última cuerda fuera u'ueber' .

Lo que finalmente quiero hacer es reemplazar todas las umlauts u en un archivo con ‘ue’:

 import sys import codecs f = codecs.open(sys.argv[1],encoding='utf-8') for line in f: print repr(line).replace(unichr(252), 'ue') 

¡Gracias por tu ayuda! (Estoy usando Python 2.3.)

Related of "¿Cómo buscar y reemplazar los caracteres especiales de utf-8 en Python?"

repr(str) devuelve una versión citada de str , que cuando se imprima, será algo que podría escribir de nuevo como Python para recuperar la cadena. Entonces, es una cadena que literalmente contiene \xfcber , en lugar de una cadena que contiene über .

Solo puede usar str.replace(unichr(252), 'ue') para reemplazar el ü con ue .

Si necesita obtener una versión citada del resultado de eso, aunque no creo que lo necesite, puede envolver la expresión completa en repr :

 repr(str.replace(unichr(252), 'ue')) 

Creo que es más fácil y claro hacerlo de una manera más directa, usando directamente la representación de Unicode os ‘ü’ mejor que unichr (252).

 >>> s = u'über' >>> s.replace(u'ü', 'ue') u'ueber' 

No hay necesidad de usar repr, ya que esto imprimirá la ‘representación de Python’ de la cadena, solo tiene que presentar la cadena legible.

También deberá incluir la siguiente línea al principio del archivo .py, en caso de que aún no esté presente, para indicar la encoding del archivo.

 #-*- coding: UTF-8 -*- 

Agregado: Por supuesto, la encoding declarada debe ser la misma que la encoding del archivo. Por favor, compruebe que, como pueden ser algunos problemas (tuve problemas con Eclipse en Windows, por ejemplo, al escribir de forma predeterminada los archivos como cp1252. También debería ser la misma encoding del sistema, que podría ser utf-8 o latin -1 u otros.


Además, no use str como la definición de una variable, ya que es parte de la biblioteca de Python. Usted podría tener problemas más tarde.

(Estoy probando Python 2.6, creo que en Python 2.3 el resultado es el mismo)

Puedes evitar todas esas cosas de encoding del archivo fuente y sus problemas. Use los nombres de Unicode, luego es muy obvio lo que está haciendo y el código se puede leer y modificar en cualquier lugar.

No conozco ningún idioma en el que la única letra latina acentuada sea minúscula-u-con-diéresis-también conocida como diéresis, así que agregué código para recorrer una tabla de traducciones bajo el supuesto de que usted necesitará eso.

 # coding: ascii translations = ( (u'\N{LATIN SMALL LETTER U WITH DIAERESIS}', u'ue'), (u'\N{LATIN SMALL LETTER O WITH DIAERESIS}', u'oe'), # et cetera ) test = u'M\N{LATIN SMALL LETTER O WITH DIAERESIS}ller von M\N{LATIN SMALL LETTER U WITH DIAERESIS}nchen' out = test for from_str, to_str in translations: out = out.replace(from_str, to_str) print out 

salida:

 Moeller von Muenchen