首页 > 解决方案 > Python regexp 捕获多行组

问题描述

给定这个字符串:

@@@@ foo foo
@@@@ bar bar
bla bla bla

@@@@ one two test
@@@@ test one two
bla bla bla bla

是否可以使用 Python 正则表达式来捕获以 开头的多行组@@@@

预期结果:

group1: '@@@@ foo foo\n@@@@ bar bar\n'
group2: '@@@@ one two test\n@@@@ test one two'

我正在尝试:

(@@@@ [A-Za-z]+)

但我确实有 4 个不同的组。

标签: pythonregex

解决方案


您可以使用

(?m)^@{4}.*(?:\n@{4}.*)*\n?

请参阅正则表达式演示

细节

  • (?m)-re.MULTILINE内联选项
  • ^- 一行的开始
  • @{4}- 4 个@字符
  • .*- 到 LF 的全系列(包括 CR)
  • (?:\n@{4}.*)*- 0次或多次重复
    • \n- 换行符 LF
    • @{4}- 四个@字符
    • .*- 线路的其余部分
  • \n?- 一个可选的 LF(使用*而不是?匹配 0 个或多个重复)

请注意,它也适用于 CRLF 结尾。

请参阅Python 演示

import re
rx = r"(?m)^@{4}.*(?:\n@{4}.*)*\n?"
s = "@@@@ foo foo\n@@@@ bar bar\nbla bla bla\n\n@@@@ one two test\n@@@@ test one two\nbla bla bla bla"
s2 = "@@@@ foo foo\r\n@@@@ bar bar\r\nbla bla bla\r\n\r\n@@@@ one two test\r\n@@@@ test one two\r\nbla bla bla bla"
print(re.findall(rx, s))
# => ['@@@@ foo foo\n@@@@ bar bar\n', '@@@@ one two test\n@@@@ test one two\n']
print(re.findall(rx, s2))
# => ['@@@@ foo foo\r\n@@@@ bar bar\r\n', '@@@@ one two test\r\n@@@@ test one two\r\n']

推荐阅读