从1个字的字符串中提取数字

时间:2012-04-05 23:11:12

标签: python python-3.x

在我试图制作的这个程序中,我有一个表达式(例如“I = 23mm”或“H = 4V”)并且我试图从中提取23(或4),所以我可以把它变成一个整数。

我一直遇到的问题是,因为我试图取出数字的表达式是1个单词,所以我不能使用split()或其他任何东西。

我看到但不起作用的一个例子是 -

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

这不会起作用,因为它只需要用空格分隔数字。如果int078vert中有一个数字,它就不会提取它。此外,我没有空间来划界。

我尝试了一个看起来像这样的,

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

但它也没有用,因为传递的数字并不总是2位数。它可能像5,或类似13.6。

我需要编写什么代码才能传递字符串,例如

I="I=2.4A"

I="A=3V"

这样我才能只提取这个字符串中的数字? (并对其进行操作)?我可以划定没有空格或其他常量字符。

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分:3)

RE可能对此有好处,但由于已经发布了一个RE答案,我将采用您的非正则表达式示例并对其进行修改:


One example I saw but wouldnt work was - 

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

好消息是split()可以接受争论。试试这个:

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

顺便提一下,这是您提供的RE的细分:

"\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

正确地做到这一点的一种方法是:

"\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