在Python 1.5.2中从字符串中提取数字

3

我目前正在使用Telit模块(GT864-py)进行工作,并尝试从使用AT命令时接收到的返回值/字符串中提取数字。

这是我正在使用的代码示例:

MDM.send('AT#ADC=1,2'+'\r', 5)
pump = MDM.receive(15)
pumpb = int(filter(str.isdigit, pump))

这将会返回响应。

#ADC: 10 (This number can range from ~10-150)
OK

现在,我想过滤掉ADC后面的数字,但是我还没有找到解决方案。
在PythonWin 1.5.2+中使用此代码会导致以下错误:
NameError: isdigit
因此,我认为isdigit在Python 1.5.2中不受支持,这是正确的吗?如果是,有人知道其他提取#ADC后面数字的方法吗?

1
你为什么要使用1.5.2版本?我猜你可以使用all函数自己编写isdigit函数。 - jonrsharpe
如果你想找到那些亲身经历过这个古老的Python版本的用户,我猜你联系Python的IRC频道会更成功。 - Kijewski
2
如果我没记错的话,Python 1.5.2 已经有正则表达式了...但是真的,Python 1.5.2?那是1999年初吧? - bruno desthuilliers
@jonrsharpe:all也不存在 :-) - RemcoGerlich
@RemcoGerlich 我也有这个怀疑,但是文档至少展示了如何实现它! - jonrsharpe
1
我使用Python 1.5.2的原因是Telit模块本身内置了一个Python v1.5.2解释器,可惜无法升级到更高版本。如果它有一个更新的版本,比如2.7,那么这个问题就会变得简单很多。但现在我只能努力寻找一种方法来让它在这台古老而过时的设备上运行。 - Chris
2个回答

2

Python 1.5.2p2 documentation 可在网上获取。事实上,str 和模块string中都没有isdigit函数。


即使在Python 1.5中,str也是支持in操作的序列,因此您可以这样做:
def isdigit(c):
    return c in '0123456789'

pumpb = int(filter(isdigit, pump))

更彻底的解析我会使用正则表达式,而不是模块re中的代码。
import re
match = re.search('#ADC:\s*(\d+)', pump)
if match:
    number = match.group(1)

这将匹配 #ADC: 后面任意数量的空格,后跟一个或多个数字 [0-9]。数字将被捕获在组1中,如果找到匹配,则其值将存储到number中。

经过初步测试,这似乎完美地运作。稍后我会用不同的数字进行更广泛的测试,但现在,非常感谢您,Haapala先生。 - Chris

0
如果字符串始终完全是"#ADC: ",那么简单的字符串切片也应该可以解决:
if pump[:6] == '#ADC: ':
    pumpb = int(pump[6:])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接