Выполнять подстановку по результатам регулярного выражения, но только при заданном условии

Прежде всего, позвольте мне пояснить, что я абсолютно ничего не знаю о регулярных выражениях, но мне нужно написать "скрипт Tagger" для MusicBrainz Picard, чтобы он не мешал тому, как я форматирую определенные аспекты названий своих треков.

Вот что мне нужно сделать: - Найти все подстроки в скобках - Затем, для тех совпадений, которые соответствуют заданным критериям и только для этих совпадений, измените скобки на скобки

Например, рассмотрим эту строку: DJ Fresh - Louder (Сиан Эванс) (Flux Pavilion & Doctor P Remix)

Его нужно изменить следующим образом: DJ Fresh - Louder (Сиан Эванс) [Flux Pavilion & Doctor P Remix]

Условие состоит в том, что если строка в скобках содержит подстроку "dj" или "mix", или "version", или "inch" и т. Д..., то окружающие ее скобки необходимо заменить на скобки.

Итак, вопрос: возможно ли создать одно выражение регулярного выражения, которое может выполнить эту операцию?

Заранее большое спасибо.

1 ответ

Решение

Предполагая, что нет вложенных скобок, вы можете использовать следующее регулярное выражение для поиска текста:

(?i)\((?=[^()]*(?:dj|mix|version|inch))([^()]+)\)

Обратите внимание, что регулярное выражение нечувствительно к регистру, из-за (?i) впереди - сделайте его чувствительным к регистру, удалив его.

Проверьте синтаксис вашего языка, чтобы увидеть, если вы можете использовать r префикс, например r'literal_string', чтобы указать буквальную строку.

И используйте следующее в качестве замены:

[$1]

Вы можете включить больше ключевых слов, добавив ключевые слова в (?:dj|mix|version|inch) часть, каждое ключевое слово отделено |, Если ключевое слово содержит (, ), [, ], |, ., +, ?, *, ^, $, \, {, } вам нужно избегать их (я на 99% уверен, что список исчерпывающий). Проще всего подумать об этом: если ключевое слово содержит только пробел и алфавитно-цифровые символы (но обратите внимание, что количество пробелов строго), вы можете добавить их в регулярное выражение, не вызывая побочных эффектов.


Рассекая регулярное выражение:

  • (?i): Нечувствительный к регистру режим

  • \(: ( является специальным символом в регулярном выражении, нужно экранировать его, добавив \,

  • (?=[^()]*(?:dj|mix|version|inch)): Позитивный прогноз (?=pattern):

    • [^()]*: Мне нужно проверить, что текст находится внутри скобки, а не снаружи или в какой-то другой скобке, поэтому я использую класс символов с отрицанием [^characters] чтобы избежать совпадения () и пролить за пределы текущего кронштейна. Предположение, которое я сделал, также вступает в силу здесь.

    • (?:dj|mix|version|inch): Список ключевых слов в группе без захвата (?:pattern), | означает чередование.

  • ([^()]+): Предположение об отсутствии вложенных скобок облегчает сопоставление всех символов внутри скобки. Текст захвачен для последующей замены, так как (pattern) захватывает группу, в отличие от (?:pattern),

  • \): ) является специальным символом в регулярном выражении, нужно экранировать его, добавив \,

Другие вопросы по тегам