2008-12-22 11 views
24

Cómo extraigo un valor doble de una cadena usando regex.Extraer flotante/valor doble

import re 

pattr = re.compile(???)  
x = pattr.match("4.5")  
+0

Podría dar algunos detalles sobre ¿Por qué no puedes usar float ("4.5")? – jfs

Respuesta

20

Aquí está la manera fácil. No use expresiones regulares para tipos incorporados.

try: 
    x = float(someString) 
except ValueError, e: 
    # someString was NOT floating-point, what now? 
+0

En realidad, esta es también la forma más segura. Considere alguna entrada incorrecta, como '0..1',' 0.0.02', es muy difícil para Regex reconocerla. Lo peor es que pretende que es correcto y produce una respuesta incorrecta. – dspjm

+0

Técnicamente correcto, pero la pregunta explícitamente especifica regexp. – VillasV

45

una expresión regular de la perldoc perlretut:

import re 
re_float = re.compile("""(?x) 
^
     [+-]?\ *  # first, match an optional sign *and space* 
     (   # then match integers or f.p. mantissas: 
      \d+  # start out with a ... 
      (
       \.\d* # mantissa of the form a.b or a. 
     )?  # ? takes care of integers of the form a 
     |\.\d+  # mantissa of the form .b 
    ) 
     ([eE][+-]?\d+)? # finally, optionally match an exponent 
    $""") 
m = re_float.match("4.5") 
print m.group(0) 
# -> 4.5 

para extraer los números de una cadena más grande:

s = """4.5 abc -4.5 abc - 4.5 abc + .1e10 abc . abc 1.01e-2 abc 
     1.01e-.2 abc 123 abc .123""" 
print re.findall(r"[+-]? *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?", s) 
# -> ['4.5', '-4.5', '- 4.5', '+ .1e10', ' 1.01e-2', 
#  '  1.01', '-.2', ' 123', ' .123'] 
+2

La expresión final es el negocio, gracias – reabow

1

flotar como expresión regular en la fuerza bruta. hay diferencias menores a la versión de JF Sebastian:

import re 
if __name__ == '__main__': 
    x = str(1.000e-123) 
    reFloat = r'(^[+-]?\d+(?:\.\d+)?(?:[eE][+-]\d+)?$)' 
    print re.match(reFloat,x) 

>>> <_sre.SRE_Match object at 0x0054D3E0> 
+0

Esto no coincide con los flotantes sin una parte entera, p. '.123' en vez de' 0.123'. –

9

Para int análisis sintáctico y el flotador (separador de punto) valores:

re.findall(r'\d+\.*\d*', 'some 12 12.3 0 any text 0.8') 

resultado:

['12', '12.3', '0', '0.8'] 
+0

Si puede ofrecer un procedimiento para obtener el int o float pero sin que esté en un diccionario o matriz, sería útil. lo que tengo 'str1 =" BIOS: versión 2.0.0 "' lo que quiero '2.0.0' sin ninguna coma o corchetes. –

+1

Hola, puede utilizar como: re.findall (r '[\ d \.] +', "BIOS: versión 2.0.0") –

+0

mejor: re.findall (r '[\ d \.] {2, } | \ d + ', "BIOS: versión 2.0.0") –