从bash命令(RaspberryPi)中提取正常运行时间值

时间:2016-03-24 16:36:03

标签: regex string python-3.x split raspberry-pi

使用uptime时我得到了例如

17:16:49 up 3:29, 3 users, load average: 0.00, 0.02, 0.05

我只想要3.29部分用于我的脚本.... 什么是最好的,最简单的方法来记住该字符串中的那个部分,记住,这个值将改变为:

22:59:49 up 109:32, 7 users, load average: 0.10, 0.02, 0.05

我试过分裂,例如:

def getUPTime():
uptime = os.popen('uptime').readline()
uptime1 = uptime.split("up  ")[0]
up = uptime1.rsplit(",")[3]
return up

但我得到一个错误list index out of range .....并且即使它会起作用我也不认为如果在pi启动期间输出的任何变化都是一个很好的解决方案

我正在考虑使用replace

regex选项

2 个答案:

答案 0 :(得分:1)

您可以在.replace()中尝试以下RegEx,该值将存储在第一个(也是唯一的)捕获组中:

\d+:\d+:\d+\s*up\s*(\d+:\d+),

Live Demo on RegExr

以下是您可以使用的完整代码:

import re
def getUPTime():
    uptime = os.popen('uptime').readline()
    uptime = re.search('\d+:\d+:\d+\s*up\s*(\d+:\d+),', uptime)
    return uptime.group(1)

答案 1 :(得分:1)

@Alastair McCormackhis comment中建议,uptime可能是最佳解决方案。

但是,您可以将[ ,]正则表达式与re.split一起使用空格和逗号分隔字符串,然后从结果数组中获取第3个元素:

Demo

import re
s = "17:16:49 up  3:29,  3 users,  load average: 0.00, 0.02, 0.05"
print(re.split(r"[ ,]+", s)[2])

您的代码如下:

import re
#...
def getUPTime():
    uptime = os.popen('uptime').readline()
    chunks = re.split(r"[ ,]+", uptime) 
    uptime1 = chunks[0]
    up = chunks[2]
    return up

备选方案1:

获取第三个单词到,

^(?:\S+\s+){2}(\S+),

Python中:

import re
p = re.compile(r'^(?:\S+\s+){2}(\S+),')
uptime = "22:59:49 up  109:32,  7 users,  load average: 0.10, 0.02, 0.05"
m = p.search(uptime)
if m:
    print(m.group(1))

请参阅regex demo

备选方案2

匹配并捕获您需要的内容,并匹配您需要移除的内容并使用re.sub

(?s)^.*?\s(\d+:\d+).*

请参阅regex demoPython demo

import re
p = re.compile(r'(?s)^.*?\s(\d+:\d+).*')
uptime = "22:59:49 up  109:32,  7 users,  load average: 0.10, 0.02, 0.05"
print(p.sub(r"\1", uptime))
相关问题