使用带有Python的Regex在大括号内检索日志消息

时间:2016-10-14 07:17:10

标签: python regex

我正在尝试解析一些以密钥对格式返回一些响应的日志。我只希望它们包含最后一个密钥对(Rs:{“..”})。我想要的信息都包含在大括号内。

我所做的是使用正则表达式匹配大括号内的任何内容,如下所示:

import re

log = '2016-10-13 17:04:50 - info - uri:"GET x/y/z" ip:1.1.1.1 Rs:{"data": "blah blah"}'

text = re.compile("Rs\:{(.*)\}").search(log).group(1)
print (text)

>>> "data": "blah blah"

# Desired results
>>> {"data": "blah blah"}

然而,有一些问题是这样做的:

  1. 我也想要开始花括号和闭合花括号。

  2. 如果在Rs值之前或之内有其他开口(“{”)或结束(“} :)花括号,则此方法不起作用。

  3. 有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

第一部分很简单:只需稍微移动捕获的parens就可以使用它作为你的正则表达式:

"Rs:(\{.*\})"

另一个问题更复杂 - 如果你想要其他部分(从{开始),那么

r'Rs:(\{.*)\Z'

会得到你想要的东西。

答案 1 :(得分:0)

您似乎需要两件事:重新调整第一个捕获组边界以包含花括号,并使用惰性版本.*(如果字符串中有多个值)。如果您使用re.search,或者只使用re.findall

,我还建议先检查是否匹配
import re
log = '2016-10-13 17:04:50 - info - uri:"GET x/y/z" ip:1.1.1.1 Rs:{"data": "blah blah"}'
text = re.compile(r"Rs:({[^}]*})").search(log)
if text:
    print (text.group(1))
# or
print(re.findall(r"Rs:({[^}]*})", log))

请参阅Python demo online

模式详情