Skip to main content
 首页 » 编程设计

python之在 python 中使用正则表达式

2025年05月04日31softidea

我有几个巨大的日志文件,其中包含事件名称和子事件的列表,以及与每个子事件关联的数值。我需要编写一个脚本来自动化数据分析过程。我使用 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在这方面做得很好。