使用正则表达式解析多行字符串

时间:2014-05-22 10:12:15

标签: python regex

这是我要解析的完整字符串:

Response
--------
{
  Return Code: 1
  Key        : <None>
  Files      : [
    {
      Return Code: 0
      Data       : 'Value' is 1
'Value' is two
This is third line of output
    }
  ]
}

这就是我想要解析的文本的样子:

'Value' is 1
'Value' is two
This is third line of output

我曾尝试弄乱re.findall(),但我无法得到我想要的东西 这是一个python脚本,它试图使用正则表达式进行解析..

import subprocess,re
output = subprocess.check_output(['staf', 'server.com', 'PROCESS', 'START', 'SHELL', 'COMMAND', "'uname'", 'WAIT', 'RETURNSTDOUT', 'STDERRTOSTDOUT'])
result = re.findall(r'Data\s+:\s+(.*)', output, re.DOTALL)[0]
print result

脚本输出..

[root@server ~]# python test.py 
''uname'' is not recognized as an internal or external command,
operable program or batch file.

    }
  ]
}

2 个答案:

答案 0 :(得分:0)

选项1

如果您想要Data:之后的三行,您可以执行以下操作,将三行捕获到第1组:

match = re.search(r"Data\s*:\s*((?:[^\n]*[\r\n]+){3})", subject)
if match:
    result = match.group(1)

选项2

如果您希望第一行之前Data:之后的所有行都有},请将正则表达式更改为:

Data\s*:\s*((?:[^\n]*(?:[\r\n]+(?!\s*}))?)+)

答案 1 :(得分:0)

使用以下正则表达式,您将找到所需的三个字符串。

请注意,这在很大程度上取决于响应的格式化方式。

>>> import re
>>> response = """
Response
--------
{
  Return Code: 1
  Key        : <None>
  Files      : [
    {
      Return Code: 0
      Data       : 'Value' is 1
'Value' is two
This is third line of output
    }
  ]
}"""
>>> re.findall(r"('Value'.*)\n(.*)\n(.*)\n.*}",response)
[("'Value' is 1", "'Value' is two", 'This is third line of output')]

您还可以在组中包含换行符,如下所示:

>>> re.findall(r"('Value'.*\n)(.*\n)(.*\n).*}",response)
[("'Value' is 1\n", "'Value' is two\n", 'This is third line of output\n')]

取决于您之后如何处理它。

<强>更新

这个怎么样?

>>> re.findall(r"Data\s*:\s*(.*?)}",response,re.DOTALL)
["'Value' is 1\n'Value' is two\nThis is third line of output\n    "]

这将从第一个&#39; Value&#39;中找到所有内容。直到第一个&#39;}&#39;。