Python中的正则表达式奇怪的行为

2024-04-26 04:01:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想分析uptimeUnix命令的输出。 这是两个不同的示例:

14:25  up 1 day,  1:24, 2 users, load averages: 0,56 0,48 0,47
14:25  up 1:24, 2 users, load averages: 0,56 0,48 0,47

(我使用的语言是Python)

所以,假设上面的两个示例被保存到变量s1和{}。在

这是我写的代码:

^{pr2}$

regex的第二部分,即占用正常运行时间数小时分钟的部分,工作得非常完美。但是为什么元组的第一部分总是None?我错过了什么?这是不是一个贪婪与非贪婪的问题?在


Tags: 代码命令语言示例时间loadusersregex
3条回答

替代方法是直接从/proc/uptime读取,而不是从命令行读取

#!/usr/bin/python

from datetime import timedelta

with open('/proc/uptime', 'r') as f:
    uptime_seconds = float(f.readline().split()[0])
    uptime_string = str(timedelta(seconds = uptime_seconds))

print(uptime_string)

输出:

^{pr2}$

现在,使用tokenise或split内建来解析它要容易得多

您想将.*?移动到可选日组中,并使用.search()

RE = r'''
    (?:(\d) \s day.*?)?   # this should match "n day" if it's there
    \s(\d{1,2}):(\d{1,2}) # this should match a space followed by "hh:mm"
'''

演示:

^{pr2}$

模式锚定在:上,然后回溯。然后,.*?匹配时间签名之前的整个文本,这符合模式。在

通过将.*?部分移到可选的day组(在我的版本中为非捕获),您可以保证它不会回溯到day文本。在

匹配从字符串的开头开始,add.*?一开始

In [37]: RE=r'.*?((\d) \s day) .*?  \s(\d{1,2}):(\d{1,2})'

In [38]: print re.match(RE, s1, re.VERBOSE).groups()
('1 day', '1', '1', '24')

相关问题 更多 >

    热门问题