提取括号中指定的数据';[]和#x27;来自python中的字符串消息
我想从下面的日志消息中提取字段 例如: 忽略条目、受影响的列[column1:column2]、原因[some reason]、详细信息[some entry Details] 我需要为“受影响的列、原因、详细信息”提取括号中指定的数据 在Python中提取这些字段的有效方法是什么提取括号中指定的数据';[]和#x27;来自python中的字符串消息,python,python-3.x,Python,Python 3.x,我想从下面的日志消息中提取字段 例如: 忽略条目、受影响的列[column1:column2]、原因[some reason]、详细信息[some entry Details] 我需要为“受影响的列、原因、详细信息”提取括号中指定的数据 在Python中提取这些字段的有效方法是什么 注意:如果需要,我可以修改日志消息格式。如果您可以随意更改日志格式,使用通用数据格式是最简单的,我建议对此类数据使用JSON。它是结构化的,但足够轻量级,甚至可以从自定义bash脚本编写它。允许您直接将其转换为本机p
注意:如果需要,我可以修改日志消息格式。如果您可以随意更改日志格式,使用通用数据格式是最简单的,我建议对此类数据使用JSON。它是结构化的,但足够轻量级,甚至可以从自定义bash脚本编写它。允许您直接将其转换为本机python对象:
import json # python has a default parser
# assume this is your log message
log_line = '{"Ignoring entry" : {"Affected columns": [1, 3], "reason" : "some reason", "Details": {}}}'
data = json.loads(log_line)
print("Columns to ignore:", data["Ignoring entry"]["Affected columns"])
如果要使用当前格式,必须使用
str
方法或re
模块
例如,您可以这样做:
log_msg = "Ignoring entry, Affected columns [column1:column2], reason[some reason], Details[some entry details]"
def parse_log_line(log_line):
if log_line.startswith("Ignoring entry"):
log_data = {
for element in log_line.split(',')[1:]: # parse all elements but the header
key, value = element.partition('[')
if value[-1] != ']':
raise ValueError('Malformed Content. Expected %r to end with "]"' % element)
value = value[:-1]
log_data[key] = value
return log_data
raise ValueError('Unrecognized log line type')
许多解析任务最好由。它允许您使用正则表达式。它们非常强大,但如果你不习惯,就很难维护。在您的情况下,以下方法可行:
log_data = {key: value for key, value in re.findall(',\s?(.+?)\s?\[(.+?)\]', log_line)}
re的工作原理如下:
一个文字逗号,用于分隔条目,
逗号后下一个元素前的任意空格序列\s*
任何非空白字符(键,通过(.+?)
捕获)“()”
键和值之间的任意空格序列\s*
文字\[
[
下一个元素之前的最短非空白字符序列(通过(.+?)
捕获的值)“()”
文字\]
]
符号
*
,+
和?
表示“任意”、“多个”和“尽可能少”。re.findall('\[([^]+),str)
为什么不干脆re.findall('\[([^]+),str)
?@marounnaroun主要是因为str
方法更适合理解编写自己的解析器是个坏主意其次,你的re没有给出关键点,并且缺少结束引号。re,(.+?)?\[(.+?)\]'
工作得更好,但也无助于可读性。@sreekarmagiri很乐意提供帮助。如果答案能解决问题,请接受。