微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用正则表达式和 pexpect

如何解决使用正则表达式和 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...

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

现在我有类似的东西:

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

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

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

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

解决方法

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

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

您可以找到有关此正则表达式 here 的很好的解释。

,

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

^Material:\s*(.+)

模式匹配:

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

看到一个 regex demo 和一个 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。