Regex und unicode
-
08-06-2019 - |
Frage
Ich habe ein Skript Parsen der Dateinamen von TV-Episoden zeigen.name.s01e02.avi-Beispiel), packt die episode Namen (aus dem www.thetvdb.com API) automatisch und benennt Sie in etwas schöner (Name der Show - [01x02].avi)
Das Skript funktioniert gut, das ist, bis Sie versuchen, und verwenden Sie es auf Dateien, die Unicode-show-Namen (etwas, das ich nie wirklich darüber nachgedacht, da alle Dateien, die ich habe sind Englisch, also meistens ziemlich viel alle fallen in [a-zA-Z0-9'\-]
)
Wie kann ich den regulären Ausdrücken übereinstimmen, Zeichen mit Akzent und die likes?Derzeit ist die regex-config-Abschnitt sieht aus wie..
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'])),
]
Lösung
Verwenden Sie ein Teilbereich der [\u0000-\uFFFF]
für das, was Sie wollen.
Sie können auch die re.UNICODE
compile-flag. Die docs sagen, dass, wenn UNICODE
eingestellt ist, \w
wird mit dem Zeichen [0-9_]
plus was auch immer ist klassifiziert als alphanumerische Unicode-Zeichen-Eigenschaften-Datenbank.
Siehe auch http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-05/2560.html.
Andere Tipps
Python-re-Modul nicht unterstützt, \p{Letter} oder \X.Jedoch, die neue regex-Implementierung auf PyPI tut.
Mastering Reguläre Ausdrücke von Jeffrey Friedl (großes Buch) wird erwähnt, dass die Sie verwenden könnten, \p{Letter} die passt unicode-Zeug, das als ein Brief.
\X scheint es als generisches Wort-Zeichen in einigen Sprachen, ermöglicht es Ihnen, mit einem einzelnen Charakter, Missachtung, wie viele bytes es nimmt.Könnte nützlich sein.