Regex и unicode
У меня есть script, который анализирует имена файлов телевизионных эпизодов (например, show.name.s01e02.avi), захватывает имя эпизода (из API www.thetvdb.com) и автоматически переименовывает их в нечто более приятное ( Показать имя - [01x02].avi)
script отлично работает, то есть до тех пор, пока вы не попытаетесь использовать его в файлах с именами Unicode (что-то, о чем я никогда не думал, поскольку все файлы, которые у меня есть, являются английскими, поэтому в основном почти все падают в пределах [a-zA-Z0-9'\-]
)
Как я могу позволить регулярным выражениям соответствовать ударным символам и симпатиям? В настоящее время раздел конфигурации regex выглядит так:
config['valid_filename_chars'] = """[email protected]£$%^&*()_+=-[]{}"'.,<>`~? """
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'])),
]
Ответы
Ответ 1
Используйте поддиапазон [\u0000-\uFFFF]
для того, что вы хотите.
Вы также можете использовать re.UNICODE
компиляции re.UNICODE
. Документы говорят, что если UNICODE
установлен, \w
будет соответствовать символам [0-9_]
плюс все, что классифицируется как буквенно-цифровое в базе данных свойств символов Юникода.
См. Также http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-05/2560.html.
Ответ 2
Модуль Python re не поддерживает \p {Letter} или \X. Тем не менее, новая реализация регулярного выражения на PyPI делает.
Ответ 3
При освоении регулярных выражений Джеффри Фридла (великая книга) упоминается, что вы можете использовать \p {Letter}, который будет соответствовать материалам Unicode, которые считаются буквой.
Ответ 4
\ X кажется доступным в качестве общего символа слова на некоторых языках, он позволяет сопоставить один символ, игнорируя количество байтов, которое он занимает. Может быть полезно.