假设我运行命令〜#。/ testapp.sh 或者例如linux 命令〜#dmesg ,并且任何此示例命令都会打印以下行: linux终端:
- 随机长线---长线----
大小:12
mydata:0x5b
mydata:0xa8
mydata:0xcc
mydata:0x18
mydata:0x15
mydata:0x18 - 随机线 -
然后我想在'0x'之后搜索all关键字,连接并将这些变量(例如: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 :(得分: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”
答案 1 :(得分: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个十六进制数字。
答案 2 :(得分:0)
os.system('dmesg')
后 dmesg
仅返回 returncode ,
您更愿意使用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))