【问题标题】:Return substring of all lines that start with [+] between two specific lines返回两个特定行之间以 [+] 开头的所有行的子字符串
【发布时间】:2023-03-21 10:04:02
【问题描述】:

我有一个示例多行字符串,如下所示:

[+] x: somerandomstuff
[!] blah
[+] x: somemorerandomstuff
[-] blah
[+] START
[+] x: 1st group to match
[!] blah
[-] blah
[+] x: 2nd group to match
[+] END

我想匹配 x: 之后看起来像 [+] x: (...) 的行中的字符串,但匹配那些在 [+] START[+] END 之间的字符串。预期结果将是两组(可能更多):

1st group to match
2nd group to match

请注意,START/END 只有一个实例。

我只设法想出了与第一组匹配的东西:

\[\+\] START.*?\[\+\] x: (.*?)\n.*\[\+\] END

我目前缺乏扩展此正则表达式以匹配其他行的知识。我不确定如何在另一个模式([+] START[+] END)之间查找与一个模式匹配的多行

REGEX101 链接:https://regex101.com/r/kCgwhr/2

注意:我知道仅使用正则表达式的解决方案可能不是最好的选择,但我想仅使用正则表达式来解决这个问题。

【问题讨论】:

标签: python regex


【解决方案1】:

我假设您使用 PCRE 兼容的正则表达式,因为您在 PCRE 模式下使用 regex101。

您可以使用 \G 连续匹配(和一些前瞻的东西)来匹配您想要的:

(?:\[\+\] START|\G(?!\A))\R(?:(?!\[\+\] x:)(?!\[\+\] END).*\R)*\[\+\] x:\s*\K.*

这匹配:

  • (?:\[\+\] START|\G(?!\A)) - 开始序列或上一场比赛之后。 \G 在第一次调用正则表达式时匹配字符串的开头,因此(?!\A) 确保仅在找到第一个匹配项后使用\G
  • \R - 任何换行符序列
  • (?:(?!\[\+\] x:)(?!\[\+\] END).*\R)* - 任意数量的行既不是以结束序列开头,也不是我们想要匹配的序列(基本上是跳过它们)
  • \[\+\] x:\s* - 开始我们要匹配的序列
  • \K - 忽略之前匹配的所有内容(所以我们只匹配我们真正想要的)
  • .*我们想要的行的内容

查看它在 regex 101 中的工作。

【讨论】:

  • 很好(如果有点疯狂),但这需要围绕正则表达式进行循环以使其多次。根据您使用的编程语言或工具,这可能需要while 循环或特殊匹配函数。
  • @melpomene 是的,但幸运的是,大多数语言或工具应该具有某种匹配所有功能。使用支持访问多次匹配的组(.net、PyPi 正则表达式)的引擎可能可以一次性完成,但之后必须循环访问内容。
猜你喜欢
  • 2012-11-05
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 2019-12-01
  • 2022-11-28
  • 2017-04-23
相关资源
最近更新 更多