我有几个巨大的日志文件,其中包含活动名称和子活动的列表,其中包含与每个子活动相关联的数值。我需要编写一个脚本来自动化数据分析过程。我使用Regex通过逐字搜索来获得我的主要活动的模式匹配。现在,我必须找到子活动并获得与之相关的数值。
例如:“ Out:数据包大小直方图Bucket 5 = 10 ”我需要检查子活动Out:Packet Sizes并获得Histogram Bucket值5 = 10。有一个像这样的子活动列表。在我的单词搜索技术中,我发现很难为我的子活动获得模式匹配。当模式与之前的整个文本匹配时,我应该使用什么正则表达式来获得5 = 10的值?
PS:所有子活动都重复了文本“ Histogram Bucket ”。我非常感谢您提出解决此问题的建议。我刚开始学习正则表达式和python。
答案 0 :(得分:1)
(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)或单独的正则表达作为第二阶段。
<强> EDIT2 强> 关于您的样品线,您也可以使用:
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))
<强> EDIT3 强>
pattern.match(input)
期望直接在输入字符串的开头找到模式。这意味着'a'
将匹配'a'
或'abc'
,但不匹配'ba'
。如果您的模式不是从头开始,则必须在正则表达式前加'.*?'
以根据需要使用尽可能多的任意字符。
'\s'
匹配任何空格字符,'[^\s]'
匹配任何非空白字符。
如果你想了解更多关于正则表达式的信息,关于这个问题的python HOWTO非常好。