5

在我尝试制作的这个程序中,我有一个表达式(例如“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"

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

4

2 回答 2

13
>>> 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'
于 2012-04-05T23:19:52.977 回答
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
于 2012-04-06T00:38:48.757 回答