заменить одинарную кавычку на двойную, если и только если после кавычки указана строка c - PullRequest
0 голосов
/ 09 февраля 2020

Я работаю в notepad ++ и использую его диалоговое окно поиска-замены.
Документация NP ++ гласит: Регулярные выражения Notepad ++ используют библиотеку регулярных выражений Boost v1.70, основанную на PCRE (* 1022 Синтаксис * совместимого регулярного выражения . ref: https://npp-user-manual.org/docs/searching

То, что я пытаюсь сделать должно быть простым, но я новичок в области регулярных выражений, и через 2-3 часа в сети поиски и игры с онлайн-тестерами регулярных выражений, я сдаюсь.
Я хочу заменить все одинарные кавычки ' на двойные кавычки ", но тогда и только тогда, когда ' относится к ПРАВО на один или несколько #, ie внутри комментария python. Например,

list1 = ['apple','banana','pear'] # All 'single quotes' to LEFT of # remained unchanged.
list2 = ['tomato','carrot'] # All 'single quotes' to RIGHT of one or more # are replaced 
# # with "double quotes", like this. 

Файл np ++ содержит более 800 строк, ручная замена будет утомительной и подвержена ошибкам. Советы приветствуются.

1 Ответ

1 голос
/ 09 февраля 2020

Это регулярное выражение должно делать то, что вы хотите:

(^[^#]*#|(?<!^)\G)[^'\n]*\K'

Он ищет ', которому предшествует либо

  1. ^[^#]*#: начало строки и некоторые количество не # символов, за которыми следует #; или
  2. (?<!^)\G: начало строки или конец предыдущего совпадения (\G), с отрицательным взглядом на начало строки (?<!^), что означает, что оно совпадает только в конце предыдущее совпадение

, а затем некоторое количество не ' или символов новой строки (чтобы предотвратить совпадение совпадений вокруг конца предыдущей строки) символов [^'\n]*.

Затем мы используем \K для сброса совпадения, чтобы все, что до этого было отброшено из совпадения, а регулярное выражение соответствовало только '.

, которое затем можно заменить на ".

Демонстрация по регулярному выражению regex101

Обновление

Вы можете избежать совпадения апострофов в словах, сопоставляя только те из них, которые предшествуют или следуют без символ слова:

(^[^#]*#|(?<!^)\G)[^'\n]*\K('(?=\W)|(?<=\W)')

Демонстрация на regex101

Обновление 2

Вы также можете иметь дело со случаем, когда есть # символов в строках, квалифицируя первую часть регулярного выражения с требованием t для заранее согласованных пар кавычек:

(?:^[^'#]*(?:'[^']*'[^#']*)*[^'#]*#|(?<!^)\G)[^'\n]*\K(?:'(?=\W)|(?<=\W)')

Демонстрация по регулярному выражению regex101

...