找到特定的字符串,然后复制它后面的单词并将其连接到变量

时间:2015-12-03 14:26:58

标签: python python-2.7

假设我运行命令〜#。/ 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

3 个答案:

答案 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))