Python 3.4 - Регулярные выражения - Соответствие внутренним фигурным скобкам внутри, а не внутри других скобок
В Python 3.4 я пытаюсь использовать два разных регулярных выражения для сопоставления двух типов внутренних фигурных скобок, то есть фигурных скобок, которые не содержат никаких других фигурных скобок.
Регулярное выражение 1) Подберите внутренние фигурные скобки, которые не входят в другие фигурные скобки или скобки, то есть следующее выражение
re.findall(r'...something...',"aaa{bbb{ccc}ddd}eee{fff}ggg(hhh{iii})jjj{kkk}")
вернул бы это
['{fff}','{kkk}']
На данный момент я пытаюсь со следующим выражением
re.findall(r'[^{(]*\{[^{}]+\}[^})]*',"aaa{bbb{ccc}ddd}eee{fff}ggg(hhh{iii})jjj{kkk}")
который, к сожалению, возвращает это:
['bbb{ccc}ddd', '}eee{fff}ggg(hhh{iii', '})jjj{kkk}']
Регулярное выражение 2) Подберите внутренние фигурные скобки, которые находятся в других фигурных скобках или скобках, то есть следующее выражение
re.findall(r'...something...',"aaa{bbb{ccc}ddd}eee{fff}ggg(hhh{iii})jjj{kkk}")
вернул бы это
['{ccc}','{iii}']
Я пытаюсь с этим выражением:
re.findall(r'[{(]*\{[^{}]+\}[})]*',"aaa{bbb{ccc}ddd}eee{fff}ggg(hhh{iii})jjj{kkk}")
но это возвращает это:
['{ccc}', '{fff}', '{iii})', '{kkk}']
Любая идея о том, как изменить эти регулярные выражения для правильного соответствия?
2 ответа
Для первого случая вы можете использовать
{[^{}]*}(?![^{}()]*(?:[({][^{}()]*[)}])*[^(){}]*[})])
Смотрите демо.
https://regex101.com/r/aT3kG2/3
Для второго случая вы можете использовать
{[^{}]*}(?=[^{}()]*(?:[({][^{}()]*[)}])*[^(){}]*[})])
Смотрите демо.
Если вам нужно одно регулярное выражение, которое соответствует "фигурным скобкам, которые не содержат никаких других фигурных скобок", найдите именно это - фигурные скобки, которые не содержат других фигурных скобок.
Например:
re.findall(r'{[^{}]+}',"aaa{bbb{ccc}ddd}eee{fff}ggg(hhh{iii})jjj{kkk}")
Это возвращает комбинацию обоих ваших дел:
['{ccc}', '{fff}', '{iii}', '{kkk}']
Если вы также хотите найти пустые скобки (например: {}
), изменить +
к *