2012-04-05 12 views
5

En este programa estoy tratando de hacer, tengo una expresión (como "I = 23mm", o "H = 4V") y estoy tratando de extraer el 23 (o el 4) fuera de él, para que yo pueda convertirlo en un número entero.Extrayendo un número de una cadena de 1 palabra

El problema que sigo encontrándome es que, dado que la expresión de la que estoy tratando de quitar los números es de 1 palabra, no puedo usar split() ni nada.

Un ejemplo vi pero el trabajo era wouldnt -

I="I=2.7A" 
[int(s) for s in I.split() if s.isdigit()] 

Esto molestaría trabajar, ya que sólo toma los números se están delimitados por espacios. Si hubiera un número en la palabra int078vert, no lo extraería. Además, el mío no tiene espacios para delimitar.

Probé una que se parecía a esto,

re.findall("\d+.\d+", "Amps= 1.4 I") 

pero no funcionó bien, ya que el número que se está pasando no es siempre 2 dígitos. Podría ser algo así como 5, o algo así como 13.6.

¿Qué código necesito para escribir de manera que si pasa una cadena, tales como

I="I=2.4A" 

o

I="A=3V" 

De modo que pueda extraer sólo el número de esta cadena? (y hacer operaciones en él)? No hay espacios u otros caracteres constantes con los que pueda delimitar.

+0

Parece que usted está tratando de resolver esto para números enteros y decimales. ¿Cada cadena siempre tendrá exactamente un número? – yoozer8

+0

Sí. Cada cadena siempre tendrá 1 número, pero puede tener múltiples decimales para hacer ese número. – Kyle

Respuesta

11
>>> import re 
>>> I = "I=2.7A" 
>>> s = re.search(r"\d+(\.\d+)?", I) 
>>> s.group(0) 
'2.7' 
>>> I = "A=3V" 
>>> s = re.search(r"\d+(\.\d+)?", I) 
>>> s.group(0) 
'3' 
>>> I = "I=2.723A" 
>>> s = re.search(r"\d+(\.\d+)?", I) 
>>> s.group(0) 
'2.723' 
+0

Muchas gracias. Funcionado bien. – Kyle

3

RE es probablemente bueno para esto, pero como uno RE respuesta ya ha sido publicado, me quedo con su ejemplo no expresiones regulares y modificarlo:


One example I saw but wouldnt work was - 

I="I=2.7A" 
[int(s) for s in I.split() if s.isdigit()] 

Lo bueno es que split() puede tomar argumentos. Prueba esto:

extracted = float("".join(i for i in I.split("=")[1] if i.isdigit() or i == ".")) 

Por cierto, aquí hay un desglose del RE que ha proporcionado:

"\d+.\d+" 
\d+ #match one or more decimal digits 
. #match any character -- a lone period is just a wildcard 
\d+ #match one or more decimal digits again 

Una forma de hacerlo (correctamente) sería:

"\d+\.?\d*" 
\d+ #match one or more decimal digits 
\.? #match 0 or 1 periods (notice how I escaped the period) 
\d* #match 0 or more decimal digits 
+0

Su solución de división es bastante clara: D. +1 –

+0

Apreciar el diferente método. +1 – Kyle

Cuestiones relacionadas