【问题标题】:python re match string with integerpython用整数重新匹配字符串
【发布时间】:2017-08-09 12:42:19
【问题描述】:

我需要匹配如下字符串:'2017-08-09,08:59:20.445 INFO {peers_peak_parameters_grid} [eval_peers_peak] Evaluating batch 0 out of 2158',

我尝试过不同的正则表达式,例如:comp = re.compile("Evaluating batch ^[-+]?[0-9]+$ out of ^[-+]?[0-9]+$")

这是一个示例用法:

def get_batch_process_time(log):                                                                                                                                                                            
    loglines = log.splitlines()                                                                                                                                                                             
    comp = re.compile("Evaluating batch ^[-+]?[0-9]+$ out of ^[-+]?[0-9]+$")                                                                                                                                
    times = []                                                                                                                                                                                              
    matches = []                                                                                                                                                                                            
    for i, line in enumerate(loglines):                                                                                                                                                                     
        if comp.search(line):                                                                                                                                                                               
            time = string2datetime(line.split(' ')[0])                                                                                                                                                      
            times.append(time)                                                                                                                                                                              
            matches.append(line)                                                                                                                                                                            
    return np.array(times), matches

不幸的是,似乎没有一行与给定的模式匹配。我假设我使用了错误的正则表达式。

什么是正确的正则表达式? 我是否正确使用re? (我应该使用匹配而不是搜索吗?)

【问题讨论】:

  • 您的字符串没有out ofEvaluating batch [-+]?[0-9]+ out of [-+]?[0-9]+ 似乎可以工作。
  • 抱歉问题中有错误。我已经编辑了示例字符串
  • 使用这个模式:Evaluating batch [0-9]{4} out of [0-9]{4}
  • @hadi 如果批次少于 1000 或多于 9999 将不起作用;它甚至不适用于提供的示例,因为第一个数字是 0
  • @hadi 无需道歉,我们都会犯错 ;) 感谢您在外面帮助人们!

标签: python regex logging


【解决方案1】:

^[-+]?[0-9]+$ 单独匹配整个字符串,该字符串由可选的加号或减号操作以及非空的数字序列组成。

当我说一个完整的字符串时,这是因为 ^$ 是“锚点”,它们将分别匹配字符串的开头和结尾,这就是你的正则表达式不起作用的原因。

我想您也可以删除可选的符号部分,即[-+]?

您可以通过在regex101(查看右上角的解释面板)或类似实用程序中测试您的正则表达式自行发现。

【讨论】:

  • 所以删除^$就够了?
  • @Donbeo 它应该与提供的示例一起使用,但我不能说你没有描述的其余数据。
  • 我想他是从需要[-+]? 并且锚点合适的地方复制的。在这里\d+ 可能就足够了。
  • 是的,我已经复制了它。我只需要在那里匹配 2 个整数,因为日志是使用 %d 生成的。我从未使用过 re,所以我不知道最佳做法是什么。无论如何,您的答案似乎都很好
  • @Donbeo 如果最后一个数字确实在行尾,我会使用Evaluating batch \d+ out of \d+$(否则删除尾随$
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2011-03-22
  • 2019-05-02
相关资源
最近更新 更多