返回两条特定行之间以[+]开头的所有行的子字符串

时间:2017-01-08 12:22:44

标签: python regex

我有一个样本的多行字符串,如下所示:

Button

我希望将[+] x: somerandomstuff [!] blah [+] x: somemorerandomstuff [-] blah [+] START [+] x: 1st group to match [!] blah [-] blah [+] x: 2nd group to match [+] END 后面的字符串与x:的行匹配,而 [+] x: (...)和{{1}之间的字符串}。预期的结果将是两组(可能会有更多):

[+] START

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

我只设法找到与第一组相匹配的东西:

[+] END

我目前缺乏扩展此正则表达式以匹配其他行的知识。我不确定如何在另一种模式(1st group to match 2nd group to match \[\+\] START.*?\[\+\] x: (.*?)\n.*\[\+\] END )之间寻找与模式匹配的多条线

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

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

1 个答案:

答案 0 :(得分:3)

我假设您使用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中查看它。