【问题标题】:Store output after finding matching string using regex and pexpect使用 regex 和 pexpect 找到匹配字符串后存储输出
【发布时间】:2021-09-02 08:06:54
【问题描述】:

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

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

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

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

现在我有类似的东西:

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

sendline 和 expect 提示部分正确列出了所有详细信息,但我无法弄清楚如何解析该命令的输出,查找显示“材料:”的部分,并且只将铝字符串存储在一个变量。

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

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

【问题讨论】:

    标签: python regex parsing regex-lookarounds pexpect


    【解决方案1】:

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

    ^Material:\s*(.+)
    

    模式匹配:

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

    查看regex demoPython 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
    

    【讨论】:

    • 您好 - 我注意到您将输出复制并粘贴到变量 s 中。有没有一种方法可以自动抓取并存储命令的整个输出,而无需将其复制并粘贴到 s 中?输出有时可能会发生变化,也是很多行
    • @rickymorty101 您可以使用lookbehind (?<=^Material:\s).+ 仅获取值,但它的效率低于捕获组。您仍然需要从 re.seach 获取值,并且由于 re.search 可能返回 None,因此您必须检查它。
    【解决方案2】:

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

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

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

    【讨论】:

    • 您好,感谢您的帮助!我将如何将此输出存储在变量中?会不会是 var = exp.expect((?
    • 您到底想存储什么?是匹配的字符串还是别的什么?
    • 匹配的字符串。我试图弄清楚如何将“铝”存储在变量中
    • 使用x = re.search(regex, string)。这会将“铝”存储在x
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多