Универсальное соответствие и замена шаблона произвольной длины, в котором известны только начало и конец

Я знаю, что обсуждались некоторые варианты этого вопроса, но, похоже, они не работают как бы универсально. Отсюда и этот вопрос.

Скажем, у меня есть текст, и в нем несколько раз появляется такой узор:

Let's start! ... blah, blah, blah... This is the end, my friend.

Я хочу заменить каждое появление этого паттерна на

Whatever.

Дело в том, что этот шаблон может быть любой произвольной длины (кроме его начала и конца), он может быть растянут на одну или несколько строк и может содержать любое количество специальных символов, включая одинарные и двойные кавычки, косые черты всех типы, HTML-теги и многое другое.

Выражение должно будет искать начальную фразу, собирать ее и все, что следует за этой фразой, независимо от того, сколько времени это займет и какой тип «материала» в пути, пока не встретит заключительную фразу, соберет ее и заменит все дело со строкой замены; затем повторите, пока не дойдете до конца текста.

Есть ли какое-нибудь универсальное выражение (на Python), которое может выполнять такую ​​работу?

Что ты пробовал? startPattern. * endPattern - это общий формат, который вам нужен.

Ajaypayne 13.09.2018 18:53

вы имеете ввиду вроде re.sub("Let's start.*my friend",s,flags=re.DOTALL)?

Jean-François Fabre 13.09.2018 18:55

точно так же regex101.com/r/J8um0E/1

Ajaypayne 13.09.2018 18:57

@Ajaypayne - Боюсь, что нет. Если вы измените шаблон на «Давайте начнем! ... бла, бла, бла ... [новая строка] Сколько еще? Это дом Джо, не так ли? [Еще одна новая строка] Это конец, мой друг . », вы получите« нет совпадения, 38 шагов ».

Jack Fleeting 13.09.2018 19:02

На ум приходят две вещи: 1 вы сказали, что начало и конец известны, но затем добавили больше к началу и концу, и 2 это XML, вы можете передать значение узла без разметки.

Ajaypayne 13.09.2018 19:04

Я только добавил текст посередине (заменив бла, бла). Начало («Давай начнем!») И конец («Это конец, мой друг») одинаковы.

Jack Fleeting 13.09.2018 19:06
regex101.com/r/J8um0E/3 plus обновил мой ответ.
Ajaypayne 13.09.2018 19:08

@@ Ajaypayne - вау, похоже, работает! Я играл с вашим примером, добавлял вещи до и после шаблона и вставлял в середину шаблона всевозможный мусор, просто чтобы проверить его - и он по-прежнему работает! Неужели это так просто? Вы не представляете, как долго я пытался это понять ... В интересах будущих исследований вам, вероятно, следует опубликовать его как полный ответ (возможно, с объяснением того, как это работает), чтобы я мог отметить это ответил. Спасибо! Изменить - я недостаточно быстр - я вижу, вы сделали это, пока я печатал; большой!

Jack Fleeting 13.09.2018 19:15
0
8
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь это просто сгенерировано из регулярного выражения - https://regex101.com/r/J8um0E/3/

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"Let's start(.*[\r\n])*.*my friend\."

test_str = ("Let's start! ... blah, blah, blah...\n"
    "How much longer? It's joe's place, isn't it?\n"
    "This is the end, my friend.")

subst = "Whatever."

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

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