Regex и Unicode
У меня есть сценарий, который анализирует имена эпизодов телевидения (например, show.name.s01e02.avi), извлекает название эпизода (из API www.thetvdb.com) и автоматически переименовывает их во что-то более приятное (Показать имя - [01x02].avi)
Сценарий работает нормально, пока вы не попытаетесь использовать его в файлах с именами Unicode (о которых я никогда не задумывался, поскольку все файлы, которые у меня есть, являются английскими, так что в основном все они находятся в пределах [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 ответа
Используйте поддиапазон из [\u0000-\uFFFF]
за то, что вы хотите.
Вы также можете использовать re.UNICODE
флаг компиляции. Документы говорят, что если UNICODE
установлен, \w
будет соответствовать персонажам [0-9_]
плюс все, что классифицируется как буквенно-цифровой в базе данных свойств символов Unicode.
Смотрите также http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-05/2560.html.
Модуль re Python не поддерживает \p{Letter} или \X. Однако новая реализация регулярных выражений в PyPI делает.
В статье "Освоение регулярных выражений" от Джеффри Фридла (отличная книга) упоминается, что вы можете использовать \p{Letter}, который будет соответствовать юникодному материалу, который считается буквой.
\X кажется доступным как универсальный символ слова на некоторых языках, он позволяет вам сопоставить один символ независимо от того, сколько байтов он занимает. Может быть полезным.