Регулярное выражение Python: многострочное сопоставление с более чем двумя подстроками - PullRequest
1 голос
/ 30 сентября 2019

Я хочу использовать регулярное выражение для поиска конфликтов слияния в файле.

Я нашел предыдущие посты, в которых показано, как найти шаблон, соответствующий этой структуре

FIRST SUBSTRING 
/* several 
    new 
     lines 
*/
SECOND SUBSTRING

, который работает со следующим регулярным выражением: (^FIRST SUBSTRING)(.+)((?:\n.+)+)(SECOND SUBSTRING)

Однако,Мне нужно сопоставить этот шаблон:

FIRST SUBSTRING 
/* several 
    new 
     lines 
*/
SECOND SUBSTRING
/* several 
    new 
     lines 
*/
THIRD SUBSTRING

Где первая, вторая и третья подстроки <<<<<<<, =======, >>>>>>> соответственно.

Я сделал (^<<<<<<<)(.+)((?:\n.+)+)(=======)(.+)((?:\n.+)+)(>>>>>>) выстрел, но он не работает, что вы можете увидеть в этой демонстрации ((^<<<<<<<)(.+)((?:\n.+)+)(=======) работает, но это не совсем то, что я ищу)

Ответы [ 2 ]

2 голосов
/ 30 сентября 2019

Ваше выражение работает с парой небольших изменений. Длины символов не совсем совпадают. И вы запрашиваете как минимум один символ после ВТОРОЙ ПОДСТРОЙКИ с (.+), когда в тексте его нет.

(<<<<<<<)(.+)((?:\n.+)+)(=======)(.*)((?:\n.+)+)(>>>>>>>)

С этого момента он создает группы, как вы ожидаете (чего нет в ответах в комментариях). Вы, вероятно, хотите различать ваш и их код.

Плюс, если вам придется выбирать среди рабочих выражений, я бы выбрал ваше вместо предложенных вариантов длячитаемость. Regex не очень удобен для чтения, а использование повторений (помимо прочего) усложняет чтение кода. Это также относится к ?:, просто для запроса определенных групп, нет необходимости избегать создания группы там.

0 голосов
/ 30 сентября 2019

Установка флага s (одна строка - точка соответствует новой строке) необходима для соответствия тексту из структуры. Таким образом, вы можете использовать .*? для выбора многострочного текста, переопределяющего \n, до следующего шаблона (? ленивый режим). С этим параметром приведенное ниже регулярное выражение соответствует тому, что вам нужно.

(<{7})(.*)(={7})(.*?)(>{7})(.*?\n)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...