Alternativa al cuantificador posesivo en python

Estoy tratando de hacer coincidir todas las apariciones del Article cadena seguido de un número (uno o más dígitos) que no están seguidos por un paréntesis de apertura. En Sublime Text, estoy usando la siguiente expresión regular:

 Article\s[0-9]++(?!\() 

para buscar la siguiente cadena:

 Article 29 Article 30(1) 

que no coincide con el Article 30(1) (como espero que lo haga) sino el Article 29 y el Article 1 .

Al intentar hacer lo mismo en Python (3) usando

 import re article_list = re.findall(r'Article\s[0-9]++(?!\()', "Article 30(1)") 

Obtengo el siguiente error porque estoy usando un cuantificador posesivo (nested) que no es compatible con la expresión regular de Python. ¿Hay alguna forma de que coincida con lo que quiero (no) que coincida en Python?

Python re no admite cuantificadores posesivos. Puede considerar utilizar el módulo de expresiones regulares PyPon de Python , que admite este tipo de cuantificadores. O utilice los siguientes métodos alternativos.

Necesitas agregar un dígito al lookahead:

 Article\s[0-9]+(?![(0-9]) ^^^ 

Ver esta demo regex .

Alternativamente, use un límite de palabra:

 Article\s[0-9]+\b(?!\() ^ 

Ver esta demo regex .

También puede emular un grupo atómico (?>...) alrededor de lo que desea hacer coincidir, usando la solución (?=(...))\1 :

 (?=(Article\s[0-9]+))\1(?!\() 

(un lookahead se comporta naturalmente como un grupo atómico, todo lo que necesita es una captura y una referencia inversa)