Ответ 1
Вам нужен умеренный жадный токен:
abc(?:(?!abc|xyz|123).)*123(?:(?!abc|xyz).)*xyz
Смотрите демонстрацию regex
Чтобы скомпилировать регулярное выражение, убедитесь, что оно совпадает между строками, используйте флаг re.DOTALL
.
Обратите внимание, что для достижения лучшей производительности с такой тяжелой моделью вам следует рассмотреть возможность ее разворачивания. Это можно сделать с помощью отрицательных классов символов и негативных обращений.
Сведения о шаблоне:
-
abc
- соответствиеabc
-
(?:(?!abc|xyz|123).)*
- сопоставить любой символ, который не является отправной точкой для последовательностей символовabc
,xyz
или123
-
123
- буквальная строка123
-
(?:(?!abc|xyz).)*
- любой символ, который не является отправной точкой для последовательностей символовabc
илиxyz
-
xyz
- конечная подстрокаxyz
См. диаграмму ниже (если используется re.S
, .
будет означать AnyChar
):
См. Демо-версия Python:
import re
p = re.compile(r'abc(?:(?!abc|xyz|123).)*123(?:(?!abc|xyz).)*xyz', re.DOTALL)
s = "abc 123 xyz\nabc abc 123 xyz\nabc text 123 xyz\nabc text xyz xyz"
print(p.findall(s))
// => ['abc 123 xyz', 'abc 123 xyz', 'abc text 123 xyz']