Вопрос

У меня есть сценарий, который анализирует имена файлов телевизионных эпизодов (например, show.name.s01e02.avi), получает название эпизода (из API www.thetvdb.com) и автоматически переименовывает их во что-то более приятное (Show Name - [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'])),
]
Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top