Это не простая задача *, но достаточно легко сделать с помощью negative lookahead assertion:
regex = re.compile(r"""
\{START\} # Match {START}
( # Match and capture the following:
(?: # Start of non-capturing group, used to match a single character
(?! # only if it's impossible to match the following:
\{ # - a literal {
(?: # Inner non-capturing group, used for the following alternation:
START # - Either match the word START
| # or
END # - the word END
) # End of inner non-capturing group
\} # - a literal }
) # End of negative lookahead assertion
. # Match any single character
)* # Repeat as often as possible
) # End of capturing group 1
\{END\} # until {END} is matched.""",
re.VERBOSE)
Результат:
>>> regex.findall("dont capture{START}capture me 1{END}dont capture{END}dont capture{START}dont capture{START}capture me 2{END}dont capture")
['capture me 1', 'capture me 2']
Регулярное выражение работает следующим образом:
- Это соответствует (но не фиксирует)
{START}
.
- Затем он сопоставляет (и захватывает) один символ за другим, проверяя на каждом символе, что это не первый символ строки (под)
{START}
или {END}
. Это гарантирует, что эти строки никогда не могут быть частью этой части матча.
- Окончательно соответствует (но не фиксируется)
{END}
.
* особенно не \{START\}(.*?)\{END\}
потому, что бы захватить {START}dont capture{START}capture me 2{END}
в примере строки.
Вы пробовали что-нибудь? –
И какое регулярное выражение у вас есть? – Jerry
Полезный намек, посмотрите на поведение '?' – jozefg