Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 非常具体的子串检索和拆分_Python_Logging_Substring - Fatal编程技术网

Python 非常具体的子串检索和拆分

Python 非常具体的子串检索和拆分,python,logging,substring,Python,Logging,Substring,我知道有很多关于子串的帖子,相信我,我已经搜索了很多帖子,寻找答案 我有很多字符串和日志中的行,我正在尝试对它们进行分类和解析 它们看起来像这样: parts = line.split(";") static = parts[0] dynamic = ";".join(parts[1:]) parts = " ".join(":".join(line.split(":")[1:]).split(

我知道有很多关于子串的帖子,相信我,我已经搜索了很多帖子,寻找答案

我有很多字符串和日志中的行,我正在尝试对它们进行分类和解析

它们看起来像这样:

parts = line.split(";")
static = parts[0]
dynamic = ";".join(parts[1:])
parts = " ".join(":".join(line.split(":")[1:]).split(" ")[4:]).split(";")
static = parts[0]
dynamic = ";".join(parts[1:])
/long/file/name/with.dots.and.extension:Jan 01 12:00:00 TYPE Static 消息动态消息

其中文件名是日志所在的文件,日期是消息放入日志的日期/时间,类型是消息的类型,然后消息由两部分组成,一个静态部分和一个动态部分,消息的静态部分不会更改,动态部分可以更改(显然)它们被一个
拆分但是可以有更多的

我希望能够提取静态消息和动态消息

到目前为止,我一直在使用这样的东西:

parts = line.split(";")
static = parts[0]
dynamic = ";".join(parts[1:])
parts = " ".join(":".join(line.split(":")[1:]).split(" ")[4:]).split(";")
static = parts[0]
dynamic = ";".join(parts[1:])
不太漂亮。我的静态部分还包含文件名、日期和类型,这是我不想要的。然后我想我会这样做:

parts = line.split(";")
static = parts[0]
dynamic = ";".join(parts[1:])
parts = " ".join(":".join(line.split(":")[1:]).split(" ")[4:]).split(";")
static = parts[0]
dynamic = ";".join(parts[1:])
我已经尝试过了,它在某种程度上是有效的,除了有时文件名可能有空格,或者类型可能有空格,或者某些东西工作不正常,有时我会将类型作为静态消息的一部分。。。效率是一个问题,因为每天都有数千行日志需要解析和分类。所以我想知道除了这项黑客工作,是否还有更好的方法

编辑:我想我会在日志中提供更多行的示例。为了修正我之前所说的,有几种类型的条目

/long/file/name/with.dots.and.extension:Jan 01 12:00:00 TYPE Static 消息动态消息

/long/file/name/with.dots.and.extension:Jan 01 12:00:00 MODULE.name TYPE THREAD.OR.CONNECTION.INFORMATION Static 消息动态消息

如您所见,有两种类型的日志条目。那些没有模块的和那些有模块的,那些有模块的可以连接到连接,一些可以连接到线程。
这使得解析更加困难。

您可以将拆分限制为第一个“;”仅:

static, dynamic = line.split(';', 1)
静态部分拆分可能需要更多的操作,但是如果您知道第一部分中的空格数将是静态的,那么可能同样的技巧也适用于此:

static = static.split(' ', 4)[-1]

如果行的第一部分更复杂(类型部分中的空格),我担心删除之前的所有内容将是一件更困难的事情。最好的办法是计算出
类型可以假定的有限值集,并使用带有该信息的正则表达式拆分静态部分。

您可以将拆分限制在第一个“;”仅:

static, dynamic = line.split(';', 1)
静态部分拆分可能需要更多的操作,但是如果您知道第一部分中的空格数将是静态的,那么可能同样的技巧也适用于此:

static = static.split(' ', 4)[-1]

如果行的第一部分更复杂(类型部分中的空格),我担心删除之前的所有内容将是一件更困难的事情。最好的办法是找出
类型可以假定的有限值集,并使用带有该信息的正则表达式分割静态部分。

您可以尝试以下方法:

>>> regexp = re.compile("^([\/.\w]*)\:(\w{3}\s\d{2}\s\d{2}\:\d{2}\:\d{2})\s([A-Z]*)\s([\w\s]*)\;([\w\s]*)$")
>>> regexp.match(line).groups()
('/long/file/name/with.dots.and.extension', 'Jan 01 12:00:00', 'TYPE', 'Static Message', 'Dynamic Message')

您可以尝试以下方法:

>>> regexp = re.compile("^([\/.\w]*)\:(\w{3}\s\d{2}\s\d{2}\:\d{2}\:\d{2})\s([A-Z]*)\s([\w\s]*)\;([\w\s]*)$")
>>> regexp.match(line).groups()
('/long/file/name/with.dots.and.extension', 'Jan 01 12:00:00', 'TYPE', 'Static Message', 'Dynamic Message')

所以你的建议是使用正则表达式?这意味着我将在日志的每一行上运行一个正则表达式。每天都有成千上万的日志。“那不是很重吗?”InbarRose:完全取决于你的体重;如果编码正确,正则表达式可以非常快。正则表达式中的A'(this | that | other)选择可以随时击败复杂的拆分、测试和连接设置。为什么不static=static。第二部分拆分('TYPE',1)[-1]?@fp:我理解
类型
是动态的,例如,它是一组值中的一个,例如
存储
检索
,或者诸如此类的东西。@InbarRose:无论如何,我维护的系统每天只能用正则表达式解析数万行。所以你的建议是使用正则表达式?这意味着我将在日志的每一行上运行一个正则表达式。每天都有成千上万的日志。“那不是很重吗?”InbarRose:完全取决于你的体重;如果编码正确,正则表达式可以非常快。正则表达式中的A'(this | that | other)选择可以随时击败复杂的拆分、测试和连接设置。为什么不static=static。第二部分拆分('TYPE',1)[-1]?@fp:我理解
类型
是动态的,例如,它是一组值中的一个,例如
存储
检索
,或者类似的东西。@InbarRose:无论如何,我维护的系统每天只能用正则表达式解析数万行。正如@Martijn Pieters所说,我提出了一个关于正则表达式帮助的新问题。正如@Martijn Pieters所说的,用正则表达式打开了一个新问题寻求帮助。谢谢,但我已经在另一个问题上取得了进展:谢谢,但我已经在另一个问题上取得了进展: