4 回答
![?](http://img1.sycdn.imooc.com/54585050000156a302200220-100-100.jpg)
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)+
,非贪婪的,?
; 第二个是右方括号]
, 或空行^$
. 也就是说,一堆行以包含右方括号或空行的第一行结尾。
![?](http://img1.sycdn.imooc.com/54584f3100019e9702200220-100-100.jpg)
TA贡献1851条经验 获得超4个赞
您可以使用一种模式来重复标题部分下行的可能格式。
这些行以单词字符开头,后跟=
一部分"..."
或[...]
\[\[title]]((?:\r?\n\w+\s*=\s*(?:"[^"]*"|\[[^\]\[]*]))*)
解释
\[\[title]]
比赛[[title]]
(
捕获组 1\r?\n
匹配一个换行符\w+\s*=\s*
匹配 1+ 个单词字符和=
可选的空白字符之间(?:
备选方案的非捕获组)
关闭非捕获组"[^"]*"
匹配来自"..."
|
要么\[[^\]\[]*]
匹配从[
...]
(?:
非捕获组)*
关闭非捕获组并可选择重复)
关闭第 1 组
![?](http://img1.sycdn.imooc.com/54584f8f00019fc002200220-100-100.jpg)
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 关注
- 83 浏览
添加回答
举报