Вы, похоже, не понимаете значения .
, *
и ?
.
.
- метасимвола, который соответствует одному символу (например, a
или .
или {
, или иногда - но не всегда - перевод строки).
*
- это метасимвол, который повторяет предыдущее регулярное выражение ноль или более раз. (Например, .*
соответствует пустой строке или всему, возможно, за исключением символов новой строки.)
?
, поскольку одиночный метасимвол повторяет предыдущее регулярное выражение ноль или один раз. (Например, .?
не соответствует ни одному символу или одному символу, возможно, за исключением символов новой строки).
Существуют также комбинации; например, *?
говорит, что нужно повторять ноль или более раз, но предпочитает как можно меньше повторений («не жадное» или «скупое» сопоставление).
Для группировки используются круглые скобки; если вы хотите использовать .group()
, вам, вероятно, следует использовать круглые скобки вокруг совпадений, которые вы хотите извлечь.
С этим, попробуйте
re.findall(r'(\{[^{}]*\})', a)
где [^{}]
соответствует одному символу, который не является фигурной скобкой, а обратная косая черта sh экранирует фигурные скобки, которые в противном случае также являются метасимволом регулярного выражения для указания определенного числа повторений (например, .{3}
соответствует трем произвольным символам, а \?{5,}
соответствует пяти или более буквальным вопросительным знакам).
Если вы хотите, чтобы l oop совпадало, возможно, предпочтительнее генератор re.finditer()
, чем re.findall()
.