RegEx: encuentra todos los dígitos después de cierta cadena

Estoy tratando de obtener todos los dígitos de la siguiente cadena después de las classes palabras ( o sus variaciones )

 Accepted for all the goods and services in classes 16 and 41. 

Rendimiento esperado:

 16 41 

Tengo varias cadenas que siguen este patrón y algunas otras como:

 classes 5 et 30 # expected output 5, 30 class(es) 32,33 # expected output 32, 33 class 16 # expected output 5 

Esto es lo que he intentado hasta ahora: https://regex101.com/r/eU7dF6/3

 (class[\(es\)]*)([and|et|,|\s]*(\d{1,}))+ 

Pero solo puedo obtener el último dígito coincidente, es decir, 41 en el ejemplo anterior.

Sugiero que coja toda la subcadena con números después de la class o las classes / class(es) y luego obtenga todos los números de esos:

 import re p = re.compile(r'\bclass(?:\(?es\)?)?(?:\s*(?:and|et|[,\s])?\s*\d+)+') test_str = "Accepted for all the goods and services in classes 16 and 41." results = [re.findall(r"\d+", x) for x in p.findall(test_str)] print([x for l in results for x in l]) # => ['16', '41'] 

Ver la demo de IDEONE.

Como no se admite la construcción \G , ni puede acceder a la stack de capturas utilizando el módulo de Python, no puede utilizar su enfoque.

Sin embargo, puede hacerlo de la manera que lo hizo con el módulo de expresión regular de PyPi .

 >>> import regex >>> test_str = "Accepted for all the goods and services in classes 16 and 41." >>> rx = r'\bclass(?:\(?es\)?)?(?:\s*(?:and|et|[,\s])?\s*(?P\d+))+' >>> res = [] >>> for x in regex.finditer(rx, test_str): res.extend(x.captures("num")) >>> print res ['16', '41'] 

Puede hacerlo en 2 pasos. El motor Regex recuerda solo el último grupo en grupos continuos.

 x="""Accepted for all the goods and services in classes 16 and 41.""" print re.findall(r"\d+",re.findall(r"class[\(es\)]*\s*(\d+(?:(?:and|et|,|\s)*\d+)*)",x)[0]) 

Salida: ['16', '41']

Si no quieres usar string

 print map(ast.literal_eval,re.findall(r"\d+",re.findall(r"class[\(es\)]*\s*(\d+(?:(?:and|et|,|\s)*\d+)*)",x)[0])) 

Salida: [16, 41]

Si tienes que hacerlo en un solo regex usa el módulo regex

 import regex x="""Accepted for all the goods and services in classes 16 and 41.""" print [ast.literal_eval(i) for i in regex.findall(r"class[\(es\)]*|\G(?:and|et|,|\s)*(\d+)",x,regex.VERSION1) if i] 

Salida: [16, 41]