我有几个巨大的日志文件,其中包含事件名称和子事件的列表,以及与每个子事件关联的数值。我需要编写一个脚本来自动化数据分析过程。我使用 Regex 通过逐字搜索为我的主要事件获取模式匹配。现在,我必须找到子事件并获取与其关联的数值。
例如:“Out: Packet Sizes Histogram Bucket 5=10”我需要检查子事件 Out: Packet Sizes 并获取 Histogram Bucket 值 5=10。有一个这样的子事件列表。在我的单词搜索技术中,我发现很难为我的子事件找到模式匹配。当模式匹配之前的整个文本时,我应该使用什么正则表达式模式来获取 5=10 值?
PS:所有子事件都重复了文本“直方图桶”。非常感谢您提出解决此问题的建议。我刚刚开始学习正则表达式和 python。
请您参考如下方法:
(1) 如果您想使用一个正则表达式,您可以使用:
known_activities = ['Out: Packet Sizes']
# you might have to use '\s' or '\ ' to protect the whitespaces.
activity_exprs = [a.replace(' ', '\s') for a in known_activities]
regexpr = r'('+'|'.join(activity_exprs)+r')\s*Histogram\sBucket\s(\d+=\d+)'
pattern = re.compile(regexpr)
match = pattern.match(input)
if match:
print('Activity: '+match.group(1))
print('Bucket: '+match.group(2))
(2) 如果您不想(或必须)匹配事件,您也可以简单地使用:
regexpr = r'(.*?)\s*Histogram\sBucket\s(\d+=\d+)'
pattern = re.compile(regexpr)
match = pattern.match(input)
if match:
print('Activity: '+match.group(1))
print('Bucket: '+match.group(2))
(3) 如果您确实想要匹配事件,您始终可以在单独的步骤中进行:
if match:
activity = match.group(1)
if activity in known_activities:
print('Activity: '+activity )
print('Bucket: '+match.group(2))
编辑一些更多的细节和解释:
items = ['a','b','c']
'|'.join(items)
产生a|b|c。在正则表达式中使用 | 表示备选方案,例如r'a(b|c)a' 将匹配 'aba' 或 'aca'。所以在 (1) 中,我基本上将所有已知的事件作为备选方案链接在一起。每个事件本身都必须是一个有效的正则表达式(这就是为什么任何“特殊”字符(例如空格)都应该被正确转义的原因)。 人们可以简单地手动将所有备选方案混搭成一个大型正则表达式,但如果有多个事件,这会变得笨拙且容易出错。
总而言之,您最好使用 (2) 并在必要时使用 (3) 或单独的正则表达式作为第二阶段。
编辑2 关于您的 sample 线,您还可以使用:
regexpr = r'([^\s]*?)\s([^\s]*?)\s([^\s]*?)\s(.*?)\s*Histogram\sBucket\s(\d+=\d+)'
pattern = re.compile(regexpr)
match = pattern.match(input)
if match:
print('Date: '+match.group(1))
print('Time: '+match.group(2))
print('Activity: '+match.group(3))
print('Sub: '+match.group(4))
print('Bucket: '+match.group(5))
编辑3 pattern.match(input) 期望直接在输入字符串的开头找到模式。这意味着 'a' 将匹配 'a' 或 'abc' 但不匹配 'ba'。如果您的模式没有从头开始,您必须在正则表达式前添加 '.*?' 以根据需要使用尽可能多的任意字符。
'\s' 匹配任何空白字符,'[^\s]' 匹配任何非空白字符。
如果您想了解更多关于正则表达式的知识,python HOWTO在这方面做得很好。
