在python中使用正则表达式

在python中使用正则表达式,python,regex,Python,Regex,我有两个巨大的日志文件,其中包含活动名称和子活动的列表,每个子活动都有一个数值。我需要编写一个脚本来自动化数据分析过程。我使用正则表达式通过逐字搜索为我的主要活动获取模式匹配。现在,我必须找到子活动并获得与之相关的数值 例如:“Out:Packet size直方图Bucket 5=10”我需要检查子活动Out:Packet size并获得直方图Bucket值5=10。下面列出了类似的子活动。在我的文字搜索技术中,我发现很难找到我的子活动的模式匹配。当模式匹配之前的整个文本时,我应该使用什么正则表

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

例如:“Out:Packet size直方图Bucket 5=10”我需要检查子活动Out:Packet size并获得直方图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)或单独的正则表达式作为第二阶段

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在这方面非常好。

您看过regexp中的捕获组吗?没有。现在我来看看,我试过了,但是没有结果。我从文件中输入每一行作为pattern.match(输入)的输入。在这之前我还应该做些什么吗?你能在你的帖子中添加一个示例(行)吗?因为我没有任何东西可以对我的代码进行测试。我的不好。我纠正了这个问题。现在我得到了输出。如果我使用你的第二个脚本,它将打印整行。我只需要稍微调整一下。非常感谢@Peter:)其中的组的索引为1。我更正了我的帖子。09/12/14 17:13:29 Process_Name Out:Packet size Histogram Bucket 6=4我的文件中的行是这样的。当我使用(.*)模式时,它会将整行打印给我,而使用['Out:..']模式无法获得匹配。你能告诉我加入第一个脚本之前的['+'|'.]是什么吗?我想展示不同sub_活动的结果。脚本运行良好,我只需要刮去时间戳和主要活动。请参考上面提到的示例行。