Выполнять подстановку по результатам регулярного выражения, но только при заданном условии
Прежде всего, позвольте мне пояснить, что я абсолютно ничего не знаю о регулярных выражениях, но мне нужно написать "скрипт 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)
,\)
:)
является специальным символом в регулярном выражении, нужно экранировать его, добавив\
,