2011-06-28 59 views
6

¿Cuál es la notación para cualquier número en re? Me gusta si estoy buscando una cadena para cualquier número, positivo o negativo. He estado usando \ d + pero no puedo encontrar 0 o -1Expresión regular para encontrar cualquier número en una cadena

+4

Pruebe 'r" -? \ D + "'. EDITAR: - no necesita escapar fuera '[]' – Evpok

+3

Regex no lee las cosas tal como son, pero en qué clase de carácter están, por lo que necesita un carácter "-" opcional para hacer coincidir los negativos. Dicho esto, \ d + absolutamente * debería * hacer coincidir 0, está en la clase de caracteres \ d '[0-9] '. – Dylnuge

+0

¿Qué pasa con '1.0e + 3' o' -123.456'? ¿Quieres que coincida con ellos también? –

Respuesta

17

Buscando positiva, negativa y/o decimales, podría utilizar [+-]?\d+(?:\.\d+)?

>>> nums = re.compile(r"[+-]?\d+(?:\.\d+)?") 
>>> nums.search("0.123").group(0) 
'0.123' 
>>> nums.search("+0.123").group(0) 
'+0.123' 
>>> nums.search("123").group(0) 
'123' 
>>> nums.search("-123").group(0) 
'-123' 
>>> nums.search("1").group(0) 
'1' 

Esto no es muy inteligente acerca de líder/ceros, por supuesto:

>>> nums.search("0001.20000").group(0) 
'0001.20000' 

Editar: corrigió la expresión regular anterior para encontrar números de un solo dígito.

Si quiere añadir soporte para la forma exponencial, tratar [+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?:

>>> nums2 = re.compile(r"[+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?") 
>>> nums2.search("-1.23E+45").group(0) 
'-1.23E+45' 
>>> nums2.search("0.1e-456").group(0) 
'0.1e-456' 
>>> nums2.search("1e99").group(0) 
'1e99' 
+2

Corrígeme pero tu expresión regular no coincidirá con los números de un solo dígito? –

+0

Ah, buena captura.Lo actualizaré para hacer que esa parte post-decimal sea opcional. –

+0

+1)) Para una buena solución –

3

\d debería estar bien para hacer coincidir cualquier entero no negativo. \d es equivalente a [0-9] (cualquier caracter de un solo dígito) así que por supuesto no coincidirá con números negativos. Añadir un signo negativo opcional en ese caso:

\-?\d+ 

\d definitivamente coincidir 0.

0

\ d coincidirá con 0 por defecto, por lo que la única necesidad es modificar su expresión regular para coincidir con los valores negativos, lo haga usted simplemente puede utilizar:

import re 
re.findall(r'[+-]?\d+', ' 1 sd 2 s 3 sfs 0 -1') 

O

import re 
re.findall(r'(?<!\S)[+-]?\d+(?!\S)', '234 +1 -10 23jjj ssf54 sdg5dfgdf') 
>>> ['234', '+1', '-10'] 
0

para que coincida con positi cinco o números negativos, como en -3 o +5, utilice [+-]?\d+:

re.findall('[+-]?\d+', 'sfkdjfsdfj-1skjfslkdjf+4') # ['-1', '+4'] 

Asegúrese de poner el signo negativo al final lo que el compilador entiende que no decir otra cosa.

0

De acuerdo con python re documentation, \ d coincide con cualquier dígito si el indicador UNICODE no está configurado. Si el indicador está establecido, entonces coincide con cualquier elemento considerado un dígito en esa configuración regional.

No va a coincidir con los números negativos, sin embargo algunas adiciones:

-?\d+ 

Esto funciona, pero no hay nada número, ya que los números son pequeñas cosas bastante complejas. Pruebe este:

[-+]?\d*\.?\d+([eE][-+]?\d+)? 
Cuestiones relacionadas