Эффективное решение вашей проблемы катастрофы c возврата заключается в моделировании атома c группы (не поддерживается Python re
модулем) используя положительный прогноз с группой захвата:
(?=((?:[a-z]+\.?\s*)+))\1§{0,2}\s*\d+
с установленными многострочными и регистрозависимыми флагами. Это позволяет избежать катастрофического возврата c, поскольку предвидение не подвержено отказу от символов.
Демо
Более понятный способ - использовать собственнический квантификатор при сопоставлении одного или нескольких вхождений буквы. Можно использовать регулярное выражение
(?:[a-z]++\.?\s*)+§{0,2}\s*\d+
с установленными многострочными и безразличными флагами. Здесь модификатор притяжения обозначается ++
.
Демо
К сожалению, модуль re
Python не поддерживает притяжательные модификаторы, но его альтернатива PyPi модуль делает.
Предположим, мы использовали регулярное выражение (?:[a-z]+\.?\s*)+§{0,2}\s*\d+
, которое не имеет притяжательного модификатора.
Для строки
Within the Context. of Article 1A(2)
[a-z]+
соответствует Within the Context
, затем \.?\s*
соответствует .
. Затем механизм регулярных выражений продолжает пытаться найти соответствие для всего регулярного выражения. Если это не удастся, он вернется к рассмотрению альтернатив и может вернуться к совпадению [a-z]+
, после чего он вернет символ t
(делая это совпадение Within the Contex
), сбросит регулярное выражение внутренний указатель движка прямо перед t
и еще раз продолжаем движение вперед.
притяжательный модификатор ++
in не позволяет движку regex отказаться от любых символов в исходном совпадении Within the Context
, тем самым избегая catastrophi c проблема с возвратом. Даже там, где возвращение catastrophi c не является проблемой, притяжательные модификаторы, где их можно использовать, могут значительно повысить эффективность.