2016-12-14 25 views
1

私はプロセスの/proc/PID/statを解析しています。ファイルは、の入力を持っています複数のグループをPython正規表現で捕捉N回

25473 (firefox) S 25468 25465 25465 0 -1 4194304 149151169 108282 32 15 2791321 436115 846 86 20 0 84 0 9648305 2937786368 209665 18446744073709551615 93875088982016 93875089099888 140722931705632 140722931699424 140660842079373 0 0 4102 33572009 0 0 0 17 1 0 0 175 0 0 93875089107104 93875089109128 93875116752896 140722931707410 140722931707418 140722931707418 140722931707879 0 

私が思い付いた:これは最初の三つのグループに一致するだけ(-?\d+\s?)の最後のグループのための一つのフィールドを返します

import re 

def get_stats(pid): 
    with open('/proc/{}/stat'.format(pid)) as fh: 
     stats_raw = fh.read() 
    stat_pattern = '(\d+\s)(\(.+\)\s)(\w+\s)(-?\d+\s?)' 
    return re.findall(stat_pattern, stats_raw) 

[('25473 ', '(firefox) ', 'S ', '25468 ')] 

私は最後のグループのセット番号と一致する方法を探していました:

'(\d+\s)(\(.+\)\s)(\w+\s)(-?\d+\s?){49}' 
+0

あなたはは、PyPIの正規表現モジュールを使用することはできますか?次に、あなたのアプローチを使用することができます。そうでなければ、2段階のステップが必要になります。 –

+0

@WiktorStribiżewこのモジュールについて知っておくと良いですが、これは別のモジュールの一部であり、別の依存関係を追加するのは理想的ではありません。あなたが答えに違いを見せても、他の誰かがこの問題に遭遇した場合には、悪い考えではありません。 – tijko

+1

それから、 ''(\ d + \ s)(\(。+ \)\ s)(\?マッチ、4番目のグループを空白で分割します。 –

答えて

1

re正規表現では、繰り返しキャプチャするたびにアクセスすることはできません。あなたはグループ4に文字列の全体の残りの部分をキャプチャして、空白で分割することがあります。

import re 
s = r'25473 (firefox) S 25468 25465 25465 0 -1 4194304 149151169 108282 32 15 2791321 436115 846 86 20 0 84 0 9648305 2937786368 209665 18446744073709551615 93875088982016 93875089099888 140722931705632 140722931699424 140660842079373 0 0 4102 33572009 0 0 0 17 1 0 0 175 0 0 93875089107104 93875089109128 93875116752896 140722931707410 140722931707418 140722931707418 140722931707879 0' 
stat_pattern = r'(\d+)\s+(\([^)]+\))\s+(\w+)\s*(.*)' 
res = [] 
for m in re.finditer(stat_pattern, s): 
    res.append(m.group(1)) 
    res.append(m.group(2)) 
    res.append(m.group(3)) 
    res.extend(m.group(4).split()) 
print(res) 

出力:

['25473', '(firefox)', 'S', '25468', '25465', '25465', '0', '-1', '4194304', '149151169', '108282', '32', '15', '2791321', '436115', '846', '86', '20', '0', '84', '0', '9648305', '2937786368', '209665', '18446744073709551615', '93875088982016', '93875089099888', '140722931705632', '140722931699424', '140660842079373', '0', '0', '4102', '33572009', '0', '0', '0', '17', '1', '0', '0', '175', '0', '0', '93875089107104', '93875089109128', '93875116752896', '140722931707410', '140722931707418', '140722931707418', '140722931707879', '0'] 

あなたは、文字通りのみグループ4に49の番号を取得する必要がある場合は、

を使用します
r'(\d+)\s+(\([^)]+\))\s+(\w+)\s*((?:-?\d+\s?){49})' 
           ^^^^^^^^^^^^^^^^^^ 

PyPi regex moduleを使用すると、r'(?P<o>\d+)\s+(?P<o>\([^)]+\))\s+(?P<o>\w+)\s+(?P<o>-?\d+\s?){49}'を使用して、必要な値でregex.search(pattern, s)アクセス.captures("o")スタックを実行した後ことがあります。

>>> import regex 
>>> s = '25473 (firefox) S 25468 25465 25465 0 -1 4194304 149151169 108282 32 15 2791321 436115 846 86 20 0 84 0 9648305 2937786368 209665 18446744073709551615 93875088982016 93875089099888 140722931705632 140722931699424 140660842079373 0 0 4102 33572009 0 0 0 17 1 0 0 175 0 0 93875089107104 93875089109128 93875116752896 140722931707410 140722931707418 140722931707418 140722931707879 0' 
>>> stat_pattern = r'(?P<o>\d+)\s+(?P<o>\([^)]+\))\s+(?P<o>\w+)\s+(?P<o>-?\d+\s?){49}' 
>>> m = regex.search(stat_pattern, s) 
>>> if m: 
    print(m.captures("o")) 

出力:

['25473', '(firefox)', 'S', '25468 ', '25465 ', '25465 ', '0 ', '-1 ', '4194304 ', '149151169 ', '108282 ', '32 ', '15 ', '2791321 ', '436115 ', '846 ', '86 ', '20 ', '0 ', '84 ', '0 ', '9648305 ', '2937786368 ', '209665 ', '18446744073709551615 ', '93875088982016 ', '93875089099888 ', '140722931705632 ', '140722931699424 ', '140660842079373 ', '0 ', '0 ', '4102 ', '33572009 ', '0 ', '0 ', '0 ', '17 ', '1 ', '0 ', '0 ', '175 ', '0 ', '0 ', '93875089107104 ', '93875089109128 ', '93875116752896 ', '140722931707410 ', '140722931707418 ', '140722931707418 ', '140722931707879 ', '0']

関連する問題