2

uptimeUnixコマンドの出力を解析したいと思います。これは2つの異なるサンプルです。

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です)

したがって、上記の2つのサンプルが変数s1とに保存されているとしs2ます。

これは私が書いたコードです:

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

>>> print re.match(RE, s1, re.VERBOSE).groups()
(None, None, '1', '24')
>>> print re.match(RE, s2, re.VERBOSE).groups()
(None, None, '1', '24')

正規表現の2番目の部分、つまり稼働時間の時間分を取得する部分は、完全に機能します。しかし、なぜタプルの最初の部分が常にあるのNoneですか?私は何が欠けていますか?それは貪欲な問題と非貪欲な問題ですか?

4

3 に答える 3

3

オプションの日グループに移動し.*? .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"
'''

デモ:

>>> 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"
... '''
>>> print re.search(RE, s1, re.VERBOSE).groups()
('1', '1', '24')
>>> print re.search(RE, s2, re.VERBOSE).groups()
(None, '1', '24')

パターンはに固定され:、その後バックトラックされます。次に.*?、パターンを満たす拍子記号の前のテキスト全体と一致します。

.*?パーツオプションのグループ(私のバージョンではキャプチャされないようにした)に移動することで、文字通りのテキストdayを超えてバックトラックしないことが保証されます。day

于 2013-03-27T14:24:23.383 に答える
0

一致は文字列の先頭から始まります。。*を追加しますか?初めに

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')
于 2013-03-27T14:30:30.050 に答える
0

コマンドラインから読み取るのではなく、別の方法として、コマンドラインから直接読み取ることもできます。/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)

出力:

35 days, 23:06:35.530000

これは、tokeniseまたはsplitビルトインを使用して解析するのがはるかに簡単になりました

于 2013-03-27T14:33:58.250 に答える