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所说的,用正则表达式打开了一个新问题寻求帮助。谢谢,但我已经在另一个问题上取得了进展:谢谢,但我已经在另一个问题上取得了进展: