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)
我有一个日志文件,其中包含这样的非结构化条目
[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)