在python中使用正则表达式

时间:2014-12-09 20:11:15

标签: python regex

我有几个巨大的日志文件,其中包含活动名称和子活动的列表,其中包含与每个子活动相关联的数值。我需要编写一个脚本来自动化数据分析过程。我使用Regex通过逐字搜索来获得我的主要活动的模式匹配。现在,我必须找到子活动并获得与之相关的数值。

例如:“ Out:数据包大小直方图Bucket 5 = 10 ”我需要检查子活动Out:Packet Sizes并获得Histogram Bucket值5 = 10。有一个像这样的子活动列表。在我的单词搜索技术中,我发现很难为我的子活动获得模式匹配。当模式与之前的整个文本匹配时,我应该使用什么正则表达式来获得5 = 10的值?

PS:所有子活动都重复了文本“ Histogram Bucket ”。我非常感谢您提出解决此问题的建议。我刚开始学习正则表达式和python。

1 个答案:

答案 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非常好。