2017-05-08 61 views
0

我想通過for循環迭代列表並通過正則表達式捕獲組建立第二個列表。我查看了與re模塊相關的文檔,但由於某種原因,正則表達式總是返回一個結果。正則表達式進行了測試,所以我確信這是有效的。python通過正則表達式遍歷列表

有什麼想法?

編輯

#! /usr/bin/python 
import re 
import subprocess 
try: 
    cmd = "ps aux|grep -i \'zabbi[x]\'" 
    cmd_stdout = subprocess.check_output(cmd, shell=True).split('\n') 
    cmd_stdout_lst = [] 
    ps_re = re.compile(r'^(\S+)\s+(\d+)\s+\d+\.\d+\s+\d+\.\d+\s+(\d+)\s+(\d+).+') 
    for line in cmd_stdout: 
     match = ps_re.findall(line) 
     if match: 
      print match 
     cmd_stdout_lst.append('\n\t\t{"{#USER}":'+'"' + match[0][0] + ',"{#PID}":'+'"'+match[0][1]+'"}'+',"{#PID}":'+'"'+match [0][2]+'"}'+',"{#PID}":'+'"'+match[0][3]+'"}') 
    print '{\n\t"data":['+','.join(cmd_stdout_lst)+']\n}' 
except: 
    raise 

$ python proc_discovery.py 
[('zabbix', '14479', '96784', '680')] 
+0

您的預期產出是多少? – TemporalWolf

+0

預期的輸出應該是一個新的json列表,如下所示: '{「data」:[{「{#USER}」:「zabbix」},{「{#PID}」:「14479」}, {「{#VSZ}」:「96784」},{「{#RSS}」:「680」}]}' – penguin02007

+0

將您的'除外:退出(1)'切換到'除外:raise'完全),所以你沒有隱藏你得到的例外。那是你的問題。您可能正在獲取列表索引超出範圍例外。 – TemporalWolf

回答

1

我看到兩件事情不對的:

  1. 你grep的正則表達式同樣的事情,簡單地zabbix會匹配。爲什麼額外[ ]
  2. 程序在循環內的第一個print之後崩潰。你沒有注意到,因爲你捕捉並忽略了異常。刪除try - except以獲取更有幫助的錯誤消息。

具體而言,問題2是re.findall()返回listtuple s。外部的list在你的情況下有一個單一的元素,內部的tuple有四個。當您嘗試爲第二個打印語句構建字符串時,實際上是將整個元組連接到前綴字符串,這會導致異常。使用match[0][0]而不是match[0]等來解決這個問題。

+0

就是這樣! 1.我添加了方括號,因此grep命令不會顯示在列表中。 2.我不知道我在多維列表上工作,因爲我認爲我總是在內部列表上工作。 – penguin02007

+0

啊,我明白了,這是避免grep進程本身出現在輸出中的一種聰明的方法:) – mvoelske