正则表达式匹配模式直到下一次出现

时间:2018-03-26 09:22:40

标签: python regex

我有以下数据:

2018-03-20 23:28:47 INFO This is an info sample(can be multiline with new line characters)
2018-03-20 23:28:47 INFO This is an info sample(can be multiline with new line characters)
2018-03-20 23:28:47 DEBUG This is a debug sample(can be multiline with new line characters) {
  'x':1,
  'y':2,
  'z':3,
  'w':4
}
2018-03-20 23:28:47 INFO This is an info sample(can be multiline with new line characters)
2018-03-20 23:28:47 DEBUG This is a debug sample(can be multiline with new line characters){
  'a':5,
  'b':6,
  'c':7,
  'd':8
}

我要提取所有DEBUG语句,为此我使用此正则表达式(\d{4}\-\d{2}\-\d{2}\ \d{2}\:\d{2}\:\d{2}\ DEBUG(.|\n|\r)*?)(?=\d{4}\-\d{2}\-\d{2}\ \d{2}\:\d{2}\:\d{2}),但它省略了最后一个DEBUG语句。获取以下输出的正则表达式应该是什么?

2018-03-20 23:28:47 DEBUG This is a debug sample(can be multiline with new line characters) {
  'x':1,
  'y':2,
  'z':3,
  'w':4
}
2018-03-20 23:28:47 DEBUG This is a debug sample(can be multiline with new line characters){
  'a':5,
  'b':6,
  'c':7,
  'd':8
}

2 个答案:

答案 0 :(得分:2)

我建议:

  • 在该行的开头锚定匹配项以使其更安全(使用(?m)
  • 通过在字符串\Z的最后添加替代方法来修复当前问题(与Ken在评论中建议的相同)
  • (.|\r|\n)*?替换效率非常低的.*?模式并添加DOTALL修饰符(?s)

整个修复程序看起来像

(?sm)^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} DEBUG\s*(.*?)(?=[\r\n]+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|\Z)

请参阅regex demo

<强>详情

  • (?sm) -
  • 上的DOTALL和MULTILINE选项
  • ^ - 开始行
  • \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} - 时间戳如模式
  • DEBUG - 文字子字符串
  • \s* - 0+ whitespaces
  • (.*?) - 第1组:任意0个字符,尽可能少,但不包括
  • (?=[\r\n]+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|\Z) - 一个积极的前瞻,需要任何一个
    • [\r\n]+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} - 一个或多个CR或LF符号,后跟时间戳,如模式
    • | - 或
    • \Z - 字符串的最后一部分

答案 1 :(得分:1)

如果您确定}的所有段落都以r"(.*DEBUG[\s\S]*?\})" 结尾,您可以使用:

DEBUG

如果{}可能有r"(.*DEBUG.*(?!=\{|\n))(\{[\s\S]*?\})?" ,也可能没有{{1}},则以下正则表达式可以解决问题:

{{1}}