4 回答
TA贡献1998条经验 获得超6个赞
这似乎有效。它不像@ArtyomVancyan 的回答那么简单或优雅,尽管它有一点优势,即它不需要在表达式末尾换行:
(?m)(?:\[\[title]]\n((?:.*\n)+?(?:\]|^$)))+
解释:
(?m): 多行修饰符。(?:\[\[title]]\n(<text until next closing square bracket or blank line>))+:找到一个或多个以 开头[[title]]\n和后跟的块<text until next closing square bracket or blank line>,并捕获这些文本。(?:.*\n)+?(?:\]|^$):两个连续的非捕获子组;第一个是一堆线,(?:.*|n)+,非贪婪的,?; 第二个是右方括号], 或空行^$. 也就是说,一堆行以包含右方括号或空行的第一行结尾。
TA贡献1851条经验 获得超4个赞
您可以使用一种模式来重复标题部分下行的可能格式。
这些行以单词字符开头,后跟=一部分"..."或[...]
\[\[title]]((?:\r?\n\w+\s*=\s*(?:"[^"]*"|\[[^\]\[]*]))*)
解释
\[\[title]]比赛[[title]](捕获组 1\r?\n匹配一个换行符\w+\s*=\s*匹配 1+ 个单词字符和=可选的空白字符之间(?:备选方案的非捕获组)关闭非捕获组"[^"]*"匹配来自"..."|要么\[[^\]\[]*]匹配从[...](?:非捕获组)*关闭非捕获组并可选择重复)关闭第 1 组
TA贡献1825条经验 获得超6个赞
与其制作一个看起来充满危险的正则表达式,不如为你的自定义格式构建一个自定义解析器可能会更好,或者你可能会发现你可以重新利用INI configparser的实现
如果标题总是被定义为在块的对内[[]] 和块的开头,您可以使用正则表达式来查找它们,但只能将它们分开
如果您对内容不感兴趣(当然下一步就是您)并且您确定结构如您所展示的那样简单,您也可以直接在这些内容上拆分两次
>>> long_string_config = """ """ # input data omitted for brevity
>>> for block in filter(None, (a.split("]]")[-1].strip() for a in long_string_config.split("[["))):
... print("---")
... print(block)
...
---
a = "1"
b = "1"
c = "1"
d = "1"
e = [
"1",
"1",
]
---
a = "2"
b = "2"
c = "2"
d = "2"
e = [
"2",
]
---
a = "a3"
b = "3"
c = "3"
---
a = "a4"
b = "4"
c = "4"
e = [
"4",
]
- 4 回答
- 0 关注
- 157 浏览
添加回答
举报
