python 规范化修复字符串

python normalizing fixing string

我有一个日志文件,其中包含这样的非结构化条目

[roomID=19, description=ZZZZ, requesterCode=20, result=-1, errors=[[code=1, text=XXXXXXrequestID=/1540], flow=10:1] [remote=0.0.0.0, host=xxx]
[roomID=19, description=ZZZZ, requesterCode=20, result=-1, errors=[[code=2, text=XXXXXX., [code=2, text=XXXXXXrequestID=/1551], flow=12:3]

如您所见,'errors' 值以“[”开头,但它没有结束符,因此更难解析

我想做的是只清理 'errors' 部分并像这样修复它: 用“{}”替换“[]”并从错误中删除重复键,这样我就可以将其读入python dict

[roomID=19, description=ZZZZ, requesterCode=20, result=-1, errors={code=1, text=XXXXXX, requestID=/1540}, flow=10:1] [remote=0.0.0.0, host=xxx]
[roomID=19, description=ZZZZ, requesterCode=20, result=-1, errors={code=2, text=XXXXXX., requestID=/1551}, flow=12:3]

我不擅长 python 但我尝试使用这个糟糕的代码。我需要你的帮助才能有效地完成它。

def fix(str):
    str = str.replace('errors=[[', 'errors={')
    ..
    return str

非常感谢

使用标准库中的 re,您可以执行更复杂的文本操作。

重要的是正确识别你的模式。

  • =[[ --> ={
  • [ -->
  • ] --> }

当然可以做得更结实

import re

log = """roomID=19, description=ZZZZ, requesterCode=20, result=-1, errors=[[code=1, text=XXXXXXrequestID=/1540], flow=10:1
roomID=19, description=ZZZZ, requesterCode=20, result=-1, errors=[[code=2, text=XXXXXX., [code=2, text=XXXXXXrequestID=/1551], flow=12:3"""

mapping = {1: '={', 2: ' ', 3: '}'}
regex = r'(=\[\[)|(\s\[)|(\])' # r stands for raw string not for regex!

log_new = re.sub(regex, lambda match: mapping[match.lastindex], log)

print(log_new)

已编辑问题的答案

log = """[roomID=19, description=ZZZZ, requesterCode=20, result=-1, errors=[[code=1, text=XXXXXXrequestID=/1540], flow=10:1] [remote=0.0.0.0, host=xxx]
[roomID=19, description=ZZZZ, requesterCode=20, result=-1, errors=[[code=2, text=XXXXXX., [code=2, text=XXXXXXrequestID=/1551], flow=12:3]"""

import re

mapping = {1: '', 2:'{code', 3: '}, '}
regex = r'(\[code=\d+,\s)|(\[+code)|(\],\s)'

log_new = re.sub(regex, lambda match: mapping[match.lastindex], log)

# split text into list
log_new = re.sub(r'(text=.+?)(requestID=)', r', ' , log_new)

print(log_new)