Вопрос:

Regex и unicode

python regex unicode character-properties

14059 просмотра

4 ответа

117042 Репутация автора

У меня есть сценарий, который анализирует имена файлов телевизионных эпизодов (например, show.name.s01e02.avi), захватывает имя эпизода (из API www.thetvdb.com) и автоматически переименовывает их во что-то приятнее (Show Name - [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'])),
]
Автор: dbr Источник Размещён: 18.08.2008 09:41

Ответы (4)


16 плюса

83615 Репутация автора

Решение

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

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

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

Автор: Mark Cidade Размещён: 18.08.2008 09:43

0 плюса

19572 Репутация автора

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

Автор: grapefrukt Размещён: 18.08.2008 09:53

4 плюса

4235 Репутация автора

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

Автор: Peter Stuifzand Размещён: 18.08.2008 10:17

5 плюса

16083 Репутация автора

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

Автор: MRAB Размещён: 01.04.2011 11:19
Вопросы из категории :
32x32