使用正则表达式拆分具有相同标题的数据块

我有一个像这样构建的长字符串:


[[title]]

a = "1"

b = "1"

c = "1"

d = "1"

e = [

 "1",

 "1",

]


[[title]]

a = "2"

b = "2"

c = "2"

d = "2"

e = [

 "2",

]


[[title]]

a = "a3"

b = "3"

c = "3"


[[title]]

a = "a4"

b = "4"

c = "4"

e = [

 "4",

]

我的目标是提取每个标题中的文本(没有标题)并将其放入切片中。我试过使用属性键(如 d 和 e),但有时它们不存在。


您可以在下面查看我的正则表达式:


(?m)(((\[\[title]]\s*\n)(?:^.+$\n)+?)(d.*?$)(\s*e(.|\n)*?])?)

我想找到一种方法来提取每个标题之间的数据,直到 \n 或字符串结尾


编辑:


我正在使用 GO,所以我不能使用 look around \ behind 语法


当年话下
浏览 85回答 4
4回答

拉莫斯之舞

您可以使用以下匹配 from[[title]]到空行的模式。`\[\[title]](.*?)^$`gms解释\[\[title]]比赛[[title]](捕获组.*?非贪婪匹配直到下一场比赛)关闭群组^$使用m(多行)标志这意味着空行查看使用Golang正则表达式引擎的演示

米琪卡哇伊

这似乎有效。它不像@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)+,非贪婪的,?;&nbsp;第二个是右方括号], 或空行^$.&nbsp;也就是说,一堆行以包含右方括号或空行的第一行结尾。

繁花不似锦

您可以使用一种模式来重复标题部分下行的可能格式。这些行以单词字符开头,后跟=一部分"..."或[...]\[\[title]]((?:\r?\n\w+\s*=\s*(?:"[^"]*"|\[[^\]\[]*]))*)解释\[\[title]]比赛[[title]](捕获组 1\r?\n匹配一个换行符\w+\s*=\s*匹配 1+ 个单词字符和=可选的空白字符之间(?:备选方案的非捕获组)关闭非捕获组"[^"]*"匹配来自"..."|要么\[[^\]\[]*]匹配从[...](?:非捕获组)*关闭非捕获组并可选择重复)关闭第 1 组正则表达式演示

胡子哥哥

与其制作一个看起来充满危险的正则表达式,不如为你的自定义格式构建一个自定义解析器可能会更好,或者你可能会发现你可以重新利用INI configparser的实现如果标题总是被定义为在块的对内[[]] 和块的开头,您可以使用正则表达式来查找它们,但只能将它们分开如果您对内容不感兴趣(当然下一步就是您)并且您确定结构如您所展示的那样简单,您也可以直接在这些内容上拆分两次>>> long_string_config = """ """&nbsp; # input data omitted for brevity>>> for block in filter(None, (a.split("]]")[-1].strip() for a in long_string_config.split("[["))):...&nbsp; &nbsp; print("---")...&nbsp; &nbsp; print(block)...---a = "1"b = "1"c = "1"d = "1"e = [&nbsp;"1",&nbsp;"1",]---a = "2"b = "2"c = "2"d = "2"e = [&nbsp;"2",]---a = "a3"b = "3"c = "3"---a = "a4"b = "4"c = "4"e = [&nbsp;"4",]
打开App,查看更多内容
随时随地看视频慕课网APP