在我试图制作的这个程序中,我有一个表达式(例如“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"
这样我才能只提取这个字符串中的数字? (并对其进行操作)?我可以划定没有空格或其他常量字符。
答案 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