python - 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 个不同的组。
解决方案
您可以使用
(?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']
推荐阅读
- c# - 哪个构建操作 (C# Microsoft Visual Studio) 适合启动在 Windows 窗体中具有零个或多个依赖项的 .exe 软件?
- java - 带有 Maven 的 Java 自动模块
- php - 在jQuery中解析数组的JSON数组
- linq - 如何在 mvc 中使用 linq 处理大量数据
- google-cloud-firestore - 如何从两个不同的 Firestore 查询构建 ListView?
- python - 如何在 django restframework 中反转 ViewSet 的自定义操作的 URL
- zsh - zsh 如何解释 shebangs 中的非绝对路径?(WAS:为什么 python3 -i 允许 shebang 中的非绝对路径?)
- c# - 将字符串从数据库转换为双精度
- python - 如何将此生成器函数转换为 lambda 表达式
- c# - ServiceStack 将 xml 反序列化为对象