【问题标题】:python regex matching a group that starts with x and ends with y several lines down [duplicate]python正则表达式匹配以x开头并以y结尾的组向下几行[重复]
【发布时间】:2018-09-22 17:18:32
【问题描述】:

我有一个案例,我必须分解一个看起来像这样的字符串:

TASK **********************************  
everything ok 
TASK **********************************  
some text here untill you get dot retry.retry  
TASK **********************************  
everything ok

我只想捕获失败的组(最后有 .retry)

TASK **********************************  
some text here untill you get dot retry.retry  

到目前为止,我使用以下正则表达式最接近我所需要的,但是,它只捕获第一组并且只捕获第一组

(?m)(TASK.*\.retry)  

有什么建议吗?

编辑:

re.findall(r"TASK.+?\.retry" , text, flags = re.DOTALL)

如果所有组都以 .retry 结尾,则会找到组,这就是问题最初的措辞,但错了......我的错。

编辑 2:
重复的答案不排除正常的组,为什么会被标记?

【问题讨论】:

  • 你可以试试这个正则表达式来匹配你想要的。 (?is)task(?:(?!\.retry|task).)*\.retryregex101.com/r/LCxVPB/90
  • @ThmLee 谢谢你,这很好用

标签: python regex


【解决方案1】:

通过分解你想要每个任务直到重试。

re.findall(r"TASK.+?\.retry" , text, flags = re.DOTALL)

变化:

由于您只需要获得结果的重试部分, 您可以通过不同的方法获得它。

list_obj = string.split("retry.retry")
repeatable_tasks = []
for each_obj in list_obj[:-1]:
    repeatable_tasks.append("".join(each_obj.rpartition("TASK")[1:]))

【讨论】:

  • r"(TASK[\s\S]+?\.retry)" 是不需要DOTALL 的替代方案,以防他想在其他地方使用默认点行为。
  • @Zinki 但这不会在单个组中从第一个任务到最后一次重试捕获它。
  • 抱歉,我更新了问题以反映我的实际需要。我不澄清是不好的。这确实找到了组,但不会排除正常的组(这是对原始问题的编辑)
  • 这与您的答案不同的原因不同(使用非贪婪运算符?)。带有 DOTALL 标志的 . 等效于 [\s\S]
  • 这并没有正确拆分组,我最终得到 1 场比赛(太长):TASK ********************************** everything ok TASK ********************************** some text here untill you get dot retry.retry
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2011-09-10
相关资源
最近更新 更多