2015-12-03 45 views
-1

可以說我運行一個命令〜#。/ testapp.sh或例如在linux 命令〜#dmesg的及任何該樣本命令打印在linux終端下面的行:查找特定的字符串,那麼之後的字複製並串連到一個變量

-random長線---長線----
尺寸:12
MYDATA:0x5b
MYDATA:0xa8
MYDATA:的0xCC
MYDATA:爲0x18
MYDATA:爲0x15
MYDATA:爲0x18 --random line--

我想然後搜索關鍵字的所有after'0x」,拼接和存儲這個變量(例如: 5b,a8,cc)作爲名爲test_variable的字符串變量中的字符串。test_variable的內容應該看起來像「5ba8cc181518」。我想在python 2.7中做到這一點。

這是我嘗試代碼:

import sys 
import os 
import re 
import time 
import string 

test_variable = "" 
test_variable = re.findall(r' bx(\W)',os.system("dmesg")) 
test_variable += test_variable 
print "content is : " + test_variables 
+0

簡單地調用使用os.system將** **不捕獲輸出。 – Rishav

回答

0

你可以嘗試像這樣一個非正則表達式的解決方案:

sample = os.popen('dmesg').read() 

# Sample 
sample = """ 
-random long line ---long line---- 
size of : 12 
mydata : 0x5b 
mydata : 0xa8 
mydata : 0xcc 
mydata : 0x18 
mydata : 0x15 
mydata : 0x18 --random line-- 
""" 

concat_out = ''.join([word.replace("0x","") 
         for word in sample.split() 
         if word.startswith("0x")]) 
print(concat_out) 

得到 「5ba8cc181518」

0

re.findall()將返回一個列表,而不是一個字符串。將其轉換爲字符串,使用方法:

''.join(re.findall(...)) 

現在的正則表達式,我建議如下:

matches = re.findall(r'mydata\s*\:\s*0x([0-9a-f]{2})', sample_data, re.IGNORECASE) 
test_variable = ''.join(matches) 

這是什麼它將接受爲有效代碼更嚴格。

如果你絕對相信「0X」爲保證,以確定代碼,並且將永遠不會出現在其他地方,你可以簡化這個:

matches = re.findall(r'0x([0-9a-f]{2})', sample_data, re.IGNORECASE) 

從本質上講,這個正則表達式查找「​​0X」之後2個十六進制數字。

0

os.system('dmesg')只返回returncode執行dmesg

後,您寧願使用subprocess模塊,而不是這樣:

import re 
import subprocess 

test_variable = subprocess.check_output('dmesg',shell=True) 
result = ''.join(re.findall(r'0x([0-9a-f]{2}', test_variable)) 
相關問題