Regex и Unicode - PullRequest
       79

Regex и Unicode

23 голосов
/ 18 августа 2008

У меня есть скрипт, который анализирует имена телевизионных эпизодов (например, show.name.s01e02.avi), получает название эпизода (из API www.thetvdb.com) и автоматически переименовывает их в нечто более приятное (Показать имя - [01x02] .avi)

Сценарий работает нормально, пока вы не попытаетесь использовать его для файлов, которые имеют шоу-имена в Юникоде (о чем я никогда не задумывался, поскольку все файлы, которые у меня есть, являются английскими, так что в основном все они находятся в пределах [a-zA-Z0-9'\-])

Как разрешить регулярным выражениям совпадать с акцентированными символами и лайками? В настоящее время раздел конфигурации регулярного выражения выглядит как ..

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'])),
]

Ответы [ 4 ]

16 голосов
/ 18 августа 2008

Используйте поддиапазон [\u0000-\uFFFF] для того, что вы хотите.

Вы также можете использовать флаг компиляции re.UNICODE. Документы говорят, что если установлено UNICODE, \w будет соответствовать символам [0-9_] плюс все, что классифицируется как буквенно-цифровое в базе данных свойств символов Unicode.

См. Также http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-05/2560.html.

5 голосов
/ 02 апреля 2011

Модуль re Python не поддерживает \ p {Letter} или \ X. Однако новая реализация регулярного выражения в PyPI делает.

4 голосов
/ 18 августа 2008

В разделе «Освоение регулярных выражений» от Джеффри Фридла (великая книга) упоминается, что вы можете использовать \ p {Letter}, который будет соответствовать юникодному материалу, который считается буквой.

0 голосов
/ 18 августа 2008

\ X кажется доступным как универсальный символ слова в некоторых языках, он позволяет вам соответствовать одному символу независимо от того, сколько байтов он занимает. Может быть полезным.

...