No entiendo por qué solo da 125, solo el primer número, ¿por qué no da todos los números positivos en esa cadena? Mi objetivo es extraer todos los números positivos.
import re pattern = re.compile(r"^[+]?\d+") text = "125 -898 8969 4788 -2 158 -947 599" matches = pattern.finditer(text) for match in matches: print(match)Intenta usar la expresión regular
-\d+|(\d+)Ignorar los partidos. Las cadenas que representan números enteros no negativos se guardan en el grupo de captura 1.
La idea es hacer coincidir pero no guardar en un grupo de captura lo que no desea (números negativos), y hacer coincidir y guardar en un grupo de captura lo que sí desea (números no negativos).
La expresión regular intenta coincidir con -\d+ . Si eso tiene éxito, el puntero de cadena interno del motor de expresiones regulares se mueve justo después del último dígito coincidente. Si -\d+ no coincide, se intenta hacer coincidir la segunda parte de la alternancia (después de | ). Si \d+ coincide, la coincidencia se guarda en el grupo de captura 1.
Cualquier signo más en la cadena se puede ignorar.
Para obtener una descripción más completa de esta técnica, consulte The Greatest Regex Trick Ever . (Busque "Tarzan"|(Tarzan) para llegar al remate).
El siguiente patrón solo coincidirá con números no negativos:
pattern = re.compile("(?:^|[^\-\d])(\d+)") pattern.findall(text)PRODUCCIÓN
['125', '8969', '4788', '158', '599']En aras de la exhaustividad, otra idea mediante el uso de \b y un lookbehind .
\b(?<!-)\d+