我正在尝试解析一些以密钥对格式返回一些响应的日志。我只希望它们包含最后一个密钥对(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"}
然而,有一些问题是这样做的:
我也想要开始花括号和闭合花括号。
如果在Rs值之前或之内有其他开口(“{”)或结束(“} :)花括号,则此方法不起作用。
有更好的方法吗?
答案 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))
模式详情:
Rs:
- 整个字Rs
和:
({[^}]*})
- 第1组捕获
{
- 文字{
[^}]*
- 除}
以外的0个字符(请参阅more details on Negated Character Classes here)}
- 文字}
。