【问题标题】:Python - Extract text block from variable and compare it to stringPython - 从变量中提取文本块并将其与字符串进行比较
【发布时间】:2018-06-26 12:13:54
【问题描述】:

我对 Python 还很陌生,但我需要编写一个 Python 脚本来从命令输出中提取文本块。

让我一步一步解释。

我首先运行一个命令给我这个输出:

B8A64EF4290336BD175189B23B91C5B0574C7FD8A533ADD4C6C17E2C8AB6E7478619483BC9CF177A86B18D902B05DEFD801E309B8825E3DBB82F10AF42FC2C0B0BA9623A41B9981CEE5CDFF6D4E03F90AD32E50711CDF2A9768D70D7B259F001031D1B44C7E25337CD34D5DB0FB8A03F93A9FDA9F180B0180EB0C3E5A2A2D8B4A234A72EE1E709B97645FF18E4997EFD8CA429C02B3937513C390158C5DA7E27318B6AFFC3B52F4FB8879D22CFCEFE08ABA15A6C526DC595F20BE0EAB7B4FACCCFA435214D4B28AC4FCB62D5BFBCD86799E6850138F8289DA9A6F0836CBC6FDEF7F0DE74A4444D5F1A974E19551AC924577970A8E916A64BA62E90EEA2D54EEB P>

接下来,我需要运行另一个命令,它会给出以下输出:

指数: 01 00 01 测试01 创建日期=(00000000) 模数: 发 a4 60 8c a1 d2 6d 8f 4a d0 cc 07 8d 7f 47 43 d0 ac 35 eb b0 08 dd ff 5c f7 39 2d 65 c4 12 3b 0d 96 53 66 99 d1 2d 76 6f b9 23 f7 fb cb ce 22 2e 50 01 cf 32 50 10 5d 0e c1 50 fd 98 01 2d 92 00 3d 96 41 6e 6c 19 0e e2 e0 bc 7e a1 e1 4a 11 dc 39 eb cf 1c 0a ce a9 8e fb ae ea e9 7b f5 c6 41 67 3c a3 75 21 5b 49 d9 05 e5 14 8c f4 94 c8 b3 05 94 a9 da 98 59 64 1a 00 a1 6b 1a 6b 3d c9 84 31 3b 1d d3 46 6c 0b bd 98 8b 76 38 7c b0 f7 d1 f2 7b 22 bf 39 fa dd 1e 95 5c a3 29 f7 e2 58 f5 d2 c8 40 6e c3 8d f3 69 72 f5 f0 fe a9 92 6e d1 c7 54 c4 b3 84 96 dd de 53 37 ec 7e 8d 62 8c 2c 01 7c 0f 30 36 01 46 d9 b2 5f 36 ff 5d 12 分贝 29 ae f1 29 49 28 8b f5 92 8a 6b 27 1b f1 3c 76 0d d9 4a b3 e9 f5 82 89 8d c1 e6 51 7e fc 98 d7 44 cb 6d 7e 7e b2 b5 e1 81 90 f2 24 90 ff 26 a9 指数: 01 00 01 0测试1 创建日期=(00000000) 模数: 94 9f 2c a3 5c 88 2d 6c 6a 79 f5 d5 a1 a0 c0 d5 b2 e0 03 9e 25 fc 7e 5b 67 7a a6 5f 1d b3 29 3d c7 85 b4 20 e8 89 34 03 e1 6a 86 e4 1e ac 2e 19 6d 9b 41 76 b2 52 1b 7d 08 1c ca 51 14 4b 08 63 3e d9 6b af 8d 4f 06 2f 39 c2 69 bc b8 5f fe de 96 27 66 ef 79 67 00 e1 72 ff e4 fd 59 47 9f 7e 05 a4 a6 3d c7 f6 93 28 16 77 2b fa 25 22 81 d5 88 2b 83 e0 7a 86 93 10 0f 4d 26 92 52 a0 d9 e5 指数: 01 00 01 03测试 创建日期=(00000000) 模数: 8e 22 19 02 70 29 34 0d 55 06 88 43 a1 d0 4d 72 f8 9e 65 95 e8 ad ce fe 57 22 ca 74 9e 28 12 66 5d a9 7f 72 c9 e0 5b da b6 c6 dd 29 26 10 9e 07 89 2f 48 60 bd d7 ff 38 75 58 f2 bc f4 ce 9f dd e0 b9 05 1f 42 f3 70 e1 20 f4 57 f0 9c b2 e3 72 b6 e7 9c 9e 85 62 c8 74 43 27 51 da da d2 85 9a 46 bb 35 37 18 93 a1 c7 63 2b 84 f1 58 a9 是 7c c6 51 4d 90 e6 7f 6e 6d 21 65 54 08 3d ce 7c 5b

你看有一个模式。 这是一个块:

指数:01 00 01 Test01 creation_date=(00000000) 模数:fa a4 60 8c a1 d2 6d 8f 4a d0 cc 07 8d 7f 47 43 d0 ac 35 eb b0 08 dd ff 5c f7 39 2d 65 c4 12 3b 0d 9 53 66 99 d1 2d 76 6f b9 23 f7 fb cb ce 22 2e 50 01 cf 32 50 10 5d 0e c1 50 fd 98 01 2d 92 00 3d 96 41 6e 6c 19 0e e2 e0 bc 7e a39 e1 4a 11 dc 1c 0a ce a9 8e fb ae ea e9 7b f5 c6 41 67 3c a3 75 21 5b 49 d9 05 e5 14 8c f4 94 c8 b3 05 94 a9 da 98 59 64 1a 00 a1 6b 1a 6b 3d c9 8d34 31 3b 1 6c 0b bd 98 8b 76 38 7c b0 f7 d1 f2 7b 22 bf 39 fa dd 1e 95 5c a3 29 f7 e2 58 f5 d2 c8 40 6e c3 8d f3 69 72 f5 f0 fe a9 92 6e d1 c7 54 c4 b3 84 96 de 53 37 ec 7e 8d 62 8c 2c 01 7c 0f 30 36 01 46 d9 b2 5f 36 ff 5d 12 db 29 ae f1 29 49 28 8b f5 92 8a 6b 27 1b f1 3c 76 0d d9 4a b3 e9 c f5 88 e6 51 7e fc 98 d7 44 cb 6d 7e 7e b2 b5 e1 81 90 f2 24 90 ff 26 a9

在命令的实际输出中,有 135 个块。

我应该实现的是比较我的第一个命令的输出和我的第二个命令的内容,如果我找到一个完全匹配的,我应该返回出现在 creation_date 之前的名称。 “Test01”、“0Test1”等

我可以通过使用“模数”一词的出现次数(因此是 135 次)创建一个 for 循环来循环第二个输出。

我遇到困难的部分是,在我的 for 循环的每个步骤中,提取下一个“块”,仅提取模数信息,删除空格并进行比较。

我可以通过硬编码一些东西来实现它,但这可能不是每次都有效,所以我更喜欢找到一个干净的解决方案。

对我有什么建议吗?

这是我目前写的代码:


#!/usr/bin/env python
import subprocess
import sys
import os


cmd1= "/opt/myCommand1"


#This returns "Modulus=verylongmodulus

So I extract only the actual modulus, removing "Modulus="

myModulus = (os.popen(cmd1).read())[8:]



cmd2 = "/opt/myCommand2"


myCommand2Output = (os.popen(cmd2).read()

occurrences = lunaCertificates.count('Modulus')

for x in range(0, occurrences):
        #Here I need to extract each block and compare it to the output of the first command. if it matches, return the name

谢谢。 史蒂夫

【问题讨论】:

  • 你写过代码吗?
  • 您是否正在尝试将第二个命令块的输出与其他块的输出进行比较?因为根据您的问题,通过比较第一个输出和第二个输出块可以实现什么?
  • @vanneilsen 我试图在第二个命令的输出中的任何位置找到我的第一个命令的输出。如果我找到它,请在创建日期之前提取名称。
  • @scharette 我添加了到目前为止我写的代码
  • 1.通过从“指数:”中拆分第二个 o/p 来创建一个列表。您将在列表中获得 135 个条目。 2.遍历列表,然后您将获得名称和模数信息。 3.在一些变量中存储名称和模块信息。 4. 对 Modulus info 变量应用 replace(" ", "") 进行规范化。 5. 现在您可以将第一个 o/p 与模数信息进行比较,如果匹配,则返回存储在变量中的名称。 6.重复相同的过程直到结束,你会得到想要的结果。 :)

标签: python


【解决方案1】:

恕我直言,您应该创建一个类 SegmentedCommand 和类似于“指数”、“名称”、“模数”等部分名称的变量。这就是 class 的创建方式。

使用字符串拆分或正则表达式和build an array of SegmentedCommand 解析您的第二个输出。

在此数组上循环并根据您的条件将您的第一个命令的输出传递给每个 SegmentedCommandcompare 值。 (这里一个数据是自己的数据,另一个是第一响应)

希望有帮助!

【讨论】:

  • 我会试一试的。谢谢
  • 嘿,我成功了。我确实创建了一个类(最终只保存了名称和模数)并且通过一些查找和切片,我能够比较两个输出并返回名称。谢谢大家。没有你们是不可能做到的。
  • @user2052570,很高兴看到你成功了!! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多