¿Expresión regular para números enteros y enteros?

Estoy tratando de detectar todos los enteros y números enteros (entre muchas otras cosas) de una cadena. Aquí están las expresiones regulares que estoy usando actualmente:

Números enteros: r"[0-9]+"

Enteros: r"[+,-]?[0-9]+"

Aquí están los problemas:

  1. Los números completos de expresiones regulares también detectan números negativos, lo que no puedo tener. ¿Cómo puedo solucionar esto? Si uso un espacio antes del inicio de la expresión regular solo obtengo números positivos, ¡pero luego obtengo un espacio al inicio de mi salida!
  2. Para números enteros, me gustaría detectar números positivos con el formato +[0-9] pero almacenarlos sin el signo.
  3. Para los enteros, me gustaría almacenar cualquier entero positivo detectado con el signo, independientemente de que esté presente en la cadena original.

Casi listo ahora: Una última cosa, tengo una cadena que dice “Agregar 10 y -15”. Quiero almacenar los enteros en una lista. Lo hago usando el findall (). Mientras se almacenan los números, es posible almacenar ’10’ como ‘+10’

Related of "¿Expresión regular para números enteros y enteros?"

Para enteros positivos, use

 r"(? 

Explicación:

 (? 

Para enteros con signo / sin signo, use

 r"[+-]?(? 

Los límites de palabras \b son cruciales para asegurarse de que todo el número coincida.

Casi lo tienes.

 import re regex = re.compile(r'(\d+)|([\+-]?\d+)') s = "1 2 3 4 5 6 +1 +2 +3 -1 -2 -3 +654 -789 321" for r in regex.findall(s): if r[0]: # whole (unsigned) print 'whole', r[0] elif r[1]: # a signed integer print 'signed', r[1] 

Resultados:

 >>> whole 1 whole 2 whole 3 whole 4 whole 5 whole 6 signed +1 signed +2 signed +3 signed -1 signed -2 signed -3 signed +654 signed -789 whole 321 

O, puede usar “o” para obtener el resultado real de una manera “más agradable”:

 print [r[0] or r[1] for r in regex.findall(s)] >>> ['1', '2', '3', '4', '5', '6', '+1', '+2', '+3', '-1', '-2', '-3', '+654', '-789', '321'] 

Edición: De acuerdo con su pregunta “¿ es posible almacenar ’10’ como ’10 ‘ ‘:

 import re def _sign(num): if r[0]: return '+%s'%r[0] else: return r[1] regex = re.compile(r'(\d+)|([\+-]?\d+)') s = "1 2 3 4 5 6 +1 +2 +3 -1 -2 -3 +654 -789 321" print [_sign(r) for r in regex.findall(s)] >>> ['+1', '+2', '+3', '+4', '+5', '+6', '+1', '+2', '+3', '-1', '-2', '-3', '+654', '-789', '+321'] 

O en 1 línea:

 print ['+%s'%r[0] if r[0] else r[1] for r in regex.findall(s)] >>> ['+1', '+2', '+3', '+4', '+5', '+6', '+1', '+2', '+3', '-1', '-2', '-3', '+654', '-789', '+321']