使用正则表达式和 pexpect 找到匹配的字符串后存储输出

Store output after finding matching string using regex and pexpect

我正在编写一个 Python 脚本,我在弄清楚如何获取我发送的命令的输出并将其存储在变量中时遇到了一些问题,但是对于该命令的整个输出 -我只想在某个单词后存储 1 个特定行的其余部分。

为了说明 - 假设我有一个输出数百行的命令,这些行都代表特定产品的某些细节。

Color: Maroon Red
Height: 187cm
Number Of Seats: 6
Number Of Wheels: 4
Material: Aluminum
Brand: Toyota 
#and hundreds of more lines...

我想解析我发送的打印上面详细信息的命令的整个输出,并且只将产品的 material 存储在变量中。

现在我有这样的东西:

child.sendline('some command that lists details')
variable = child.expect(["Material: .*"])
print(variable)
child.expect(prompt)

sendline 和 expect 提示部分正确列出了所有详细信息,但我无法弄清楚如何解析该命令的输出,请查找显示“Material:”的部分以及仅将铝弦存储在变量中。

因此,与其让变量等于并打印当前正在打印的值 0,不如打印单词“Aluminum”。

有没有办法使用正则表达式来做到这一点?我正在尝试习惯使用正则表达式,所以我更喜欢使用它的解决方案,但如果没有,我仍然会很感激任何帮助!我还在 vim 中编辑我的代码,如果有帮助,我会使用 linux。

您只需查找子串Material: 。为此,您可以将要匹配的字符串(我使用的是点字符,意思是“匹配任何字符”)放在 Material: 的正向后视和 \r\n 的正向前视之间:

(?<=Material:\s).*(?=[\r\n])

你可以找到这个正则表达式的很好的解释 here

当您使用 Python 时,您可以使用捕获组并将值存储在例如示例代码中的 my_var 中。

^Material:\s*(.+)

模式匹配:

  • ^ 字符串开头
  • Material:\s* 匹配 Material: 和可选的空白字符
  • (.+) 捕获 组 1 匹配除换行符以外的任何字符 1 次以上

看到一个regex demo and a Python demo

例如

import re

regex = r"^Material:\s*(.+)"

s = ("Color: Maroon Red\n"
            "Height: 187cm\n"
            "Number Of Seats: 6\n"
            "Number Of Wheels: 4\n"
            "Material: Aluminum\n"
            "Brand: Toyota \n"
            "#and hundreds of more lines...")

match = re.search(regex, s, re.MULTILINE)
if match:
    my_var = match.group(1)
    print(my_var)

输出

Aluminum