Regex y unicode
-
08-06-2019 - |
Pregunta
Tengo un script que analiza los nombres de los episodios de TV (mostrar.nombre.s01e02.avi por ejemplo), agarra el episodio nombre (de la www.thetvdb.com API) y cambia automáticamente el nombre de ellos en algo más agradable (Mostrar Nombre - [01x02].avi)
El script funciona bien, es decir, hasta que tratar y utilizar los archivos que han Unicode show-nombres (algo que nunca he pensado realmente, ya que todos los archivos que tengo son en inglés, por lo que en su mayoría bastante-mucho todos caen dentro de [a-zA-Z0-9'\-]
)
¿Cómo puedo permitir que las expresiones regulares para que coincida con los caracteres acentuados y los gustos?Actualmente el regex de configuración de la sección parece..
config['valid_filename_chars'] = """0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@£$%^&*()_+=-[]{}"'.,<>`~? """
config['valid_filename_chars_regex'] = re.escape(config['valid_filename_chars'])
config['name_parse'] = [
# foo_[s01]_[e01]
re.compile('''^([%s]+?)[ \._\-]\[[Ss]([0-9]+?)\]_\[[Ee]([0-9]+?)\]?[^\\/]*$'''% (config['valid_filename_chars_regex'])),
# foo.1x09*
re.compile('''^([%s]+?)[ \._\-]\[?([0-9]+)x([0-9]+)[^\\/]*$''' % (config['valid_filename_chars_regex'])),
# foo.s01.e01, foo.s01_e01
re.compile('''^([%s]+?)[ \._\-][Ss]([0-9]+)[\.\- ]?[Ee]([0-9]+)[^\\/]*$''' % (config['valid_filename_chars_regex'])),
# foo.103*
re.compile('''^([%s]+)[ \._\-]([0-9]{1})([0-9]{2})[\._ -][^\\/]*$''' % (config['valid_filename_chars_regex'])),
# foo.0103*
re.compile('''^([%s]+)[ \._\-]([0-9]{2})([0-9]{2,3})[\._ -][^\\/]*$''' % (config['valid_filename_chars_regex'])),
]
Solución
Utilice una sierra de [\u0000-\uFFFF]
para lo que quieres.
También puede utilizar el re.UNICODE
compilación de la bandera. El docs dicen que si UNICODE
se establece, \w
coincidirá con los personajes [0-9_]
además de lo que se clasifica como alfanuméricos en las propiedades de caracteres Unicode de la base de datos.
Ver también http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-05/2560.html.
Otros consejos
Python re módulo no support \p{Letra} o \X.Sin embargo, la new regex aplicación en PyPI no.
En el dominio de las Expresiones Regulares de Jeffrey Friedl (gran libro) se menciona que podría utilizar \p{Letra} que coincidirá con unicode cosas que se considera una carta.
\X parece estar disponible como una palabra genérica de caracteres en algunos idiomas, permite a coincidir con un único personaje sin tener en cuenta cuántos bytes ocupa.Podría ser útil.