La manera de resolver este problema es hacer una decisión en la que se permiten caracteres (diferentes sistemas tienen diferentes reglas para los identificadores válidos.
Una vez que decida sobre la que se permiten caracteres, escribir un permitido() predicado y una subclase dict para su uso con str.translate:
def makesafe(text, allowed, substitute=None):
''' Remove unallowed characters from text.
If *substitute* is defined, then replace
the character with the given substitute.
'''
class D(dict):
def __getitem__(self, key):
return key if allowed(chr(key)) else substitute
return text.translate(D())
Esta función es muy flexible Nos dejó usted especificar fácilmente reglas para decidir qué texto se mantiene y qué texto es o bien reemplazado o retirado..
Aquí está un ejemplo sencillo usando la regla "sólo permiten caracteres que se encuentran en la categoría Unicode L":
import unicodedata
def allowed(character):
return unicodedata.category(character).startswith('L')
print(makesafe('the*ides&of*march', allowed, '_'))
print(makesafe('the*ides&of*march', allowed))
Ese código produce la salida segura de la siguiente manera:
the_ides_of_march
theidesofmarch
"My International Text: åäö" es un nombre de archivo perfectamente válido en todos los sistemas que uso, por lo que es posible que desee ser un poco más específico. Por ejemplo, ¿qué personajes quieres (des) permitir? –
@LaurenceGonsalves Podría ser perfectamente válido, pero eso no significa que sobrevivirá necesariamente a un servidor web/navegador web/combo web particular cuando se descarga. Cuando llega ese informe de errores, generalmente es más rápido simplemente despojar los acentos que tratar de descubrir dónde radica el problema. – millimoose
posible duplicado de [¿Cuál es la mejor manera de eliminar acentos en una cadena unicode de python?] (Http://stackoverflow.com/questions/517923/what-is-the-best-way-to-remove-accents-in -a-python-unicode-string) – Johnsyweb