Regex e unicode
-
08-06-2019 - |
Domanda
Ho uno script che analizza i file di episodi di serie TV (vedi.nome.s01e02.avi per esempio), afferra l'episodio nome (dal www.thetvdb.com API) e rinomina automaticamente in qualcosa di più bello (Vedi Nome - [01x02].avi)
Lo script funziona bene, che è fino a quando si tenta di utilizzare su file Unicode show-nomi (cosa che non ho mai davvero pensato, dal momento che tutti i file che ho sono in inglese, quindi per la maggior parte abbastanza-molto rientrano nell'ambito [a-zA-Z0-9'\-]
)
Come è possibile consentire le espressioni regolari per abbinare i caratteri accentati e simili?Attualmente la regex config sezione sembra..
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'])),
]
Soluzione
Utilizzare solo una porzione di [\u0000-\uFFFF]
per ciò che si desidera.
È inoltre possibile utilizzare il re.UNICODE
compilare bandiera. La documentazione dire che se UNICODE
è impostato, \w
corrispondono i caratteri [0-9_]
più tutto ciò che è classificato come alfanumerici nella proprietà dei caratteri Unicode database.
Vedi anche http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-05/2560.html.
Altri suggerimenti
Python modulo re non supporta \p{Letter} o \X.Tuttavia, l' new regex implementazione su PyPI fa.
Nella Padronanza di Espressioni Regolari da Jeffrey Friedl (libro) non è detto che si potrebbe usare \p{Letter} che corrisponde a unicode roba che è considerata una lettera.
\X sembra essere disponibile come un termine generico caratteri in alcune lingue, permette di abbinare un singolo carattere trascurando di quanti byte occupa.Potrebbe essere utile.