Python regexp捕获多行组

时间:2018-05-28 05:26:20

标签: python regex

鉴于此字符串:

@@@@ 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个不同的小组。

1 个答案:

答案 0 :(得分:0)

您可以使用

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

请参阅regex demo

<强>详情

  • (?m) - re.MULTILINE内联选项
  • ^ - 开始行
  • @{4} - 4 @个字符
  • .* - 整行到LF(包含CR)
  • (?:\n@{4}.*)* - 重复0次或更多次
    • \n - 新行LF
    • @{4} - 四个@字符
    • .* - 其余部分
  • \n? - 可选的LF(使用*代替?来匹配0次或更多次重复)

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

请参阅Python demo

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']