Хобрук: Ваш путь к мастерству в программировании

Регулярное выражение и юникод

У меня есть скрипт, который анализирует имена файлов телевизионных эпизодов (например, 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'])),
]

Ответы:


1

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

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

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

18.08.2008

2

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

01.04.2011
  • \X этого модуля сломан; они неправильно поняли стандарт. Вы не можете просто использовать \PM\pM*, иначе вы ошибетесь. Рассмотрим строку "\r\r\n\x{301}A\x{301}". соответствующее приложение находит следующие 4 совпадения для \X: 1 CP U+000D, 2 CP U+000D U+000A, 1 CP U+0301 и 2 CP U+0041 U+0301. Сломанный \PM\pM* также находит 4 совпадения, но неправильные: 1 CP U+000D, 1 CP U+000D, 2 CP U+000A U+0301 и 2 CP U+0041 U+0301. . Вы ДОЛЖНЫ не разбивать CRLF и не ставить Знаки на любые кодовые точки \P{Grapheme_Base}. 02.04.2011
  • Определение \X было основано на содержимом этого: regular-expressions.info/unicode.html. Я посмотрю, смогу ли я это исправить. 02.04.2011
  • Первоначальная идея кластера графем была немного запутанной в нескольких вещах, поэтому первые люди, которые перешли к \X, в конечном итоге сделали это немного неправильно. Текущие реализации ICU и Perl делают это правильно и даже используют расширенные определения кластера графем: попробуйте perl5.12.0 -le 'printf "%d %v04X\n", length, $_ for "\r\r\n\x{301}A\x{301}" =~ /\X/g' или более позднюю версию, чтобы увидеть улучшенные ответы. 02.04.2011
  • @tchrist: Кажется, сейчас это исправлено (или никогда не ломалось). python -c'import regex as re; print(re.findall(u"\X", u"\r\r\n\u0301A\u0301"))' печатает ожидаемые результаты: [u'\r', u'\r\n', u'\u0301', u'A\u0301'] 21.12.2013
  • @ J.F.Sebastian Я знаю, что это было исправлено. Я долго переписывался с автором. Он великолепен. 21.12.2013

  • 3

    В Mastering Regular Expressions от Jeffrey Friedl (отличная книга) упоминается, что вы можете использовать \p{Letter}, который будет соответствовать материалу Unicode, который считается буквой.

    18.08.2008
  • \p{Letter} не поддерживается во всех движках регулярных выражений, а в случае с Python он не поддерживается в движке re по умолчанию. Он поддерживается только в пакете regex. 11.11.2015

  • 4

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

    18.08.2008
    Новые материалы

    Как я могу подписаться на тему изображений в ROS Matlab и получить изображение RGB?
    Привет, Пожалуйста, как я могу извлечь изображение из сообщения ROS Image, за которым следует imshow? Я уже подписался на правильную тему, но message.getData() дает мне объект..

    Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
    Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

    Как интегрировать модель машинного обучения на ios с помощью CoreMl
    С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..