提取括号中指定的数据';[]和#x27;来自python中的字符串消息

提取括号中指定的数据';[]和#x27;来自python中的字符串消息,python,python-3.x,Python,Python 3.x,我想从下面的日志消息中提取字段 例如: 忽略条目、受影响的列[column1:column2]、原因[some reason]、详细信息[some entry Details] 我需要为“受影响的列、原因、详细信息”提取括号中指定的数据 在Python中提取这些字段的有效方法是什么 注意:如果需要,我可以修改日志消息格式。如果您可以随意更改日志格式,使用通用数据格式是最简单的,我建议对此类数据使用JSON。它是结构化的,但足够轻量级,甚至可以从自定义bash脚本编写它。允许您直接将其转换为本机p

我想从下面的日志消息中提取字段

例如:

忽略条目、受影响的列[column1:column2]、原因[some reason]、详细信息[some entry Details]

我需要为“受影响的列、原因、详细信息”提取括号中指定的数据

在Python中提取这些字段的有效方法是什么


注意:如果需要,我可以修改日志消息格式。

如果您可以随意更改日志格式,使用通用数据格式是最简单的,我建议对此类数据使用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很乐意提供帮助。如果答案能解决问题,请接受。