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")
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")
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?
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
Técnicamente correcto, pero la pregunta explícitamente especifica regexp. – VillasV
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']
La expresión final es el negocio, gracias – reabow
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>
Esto no coincide con los flotantes sin una parte entera, p. '.123' en vez de' 0.123'. –
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']
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. –
Hola, puede utilizar como: re.findall (r '[\ d \.] +', "BIOS: versión 2.0.0") –
mejor: re.findall (r '[\ d \.] {2, } | \ d + ', "BIOS: versión 2.0.0") –
Podría dar algunos detalles sobre ¿Por qué no puedes usar float ("4.5")? – jfs