为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
当年话下 2022-12-19 20:02:03
我有一个像这样构建的长字符串:[[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 语法
查看完整描述

4 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

您可以使用以下匹配 from[[title]]到空行的模式。

`\[\[title]](.*?)^$`gms

解释

  • \[\[title]]比赛[[title]]

  • (捕获组

    • .*?非贪婪匹配直到下一场比赛

  • )关闭群组

  • ^$使用m(多行)标志这意味着空行

查看使用Golang正则表达式引擎的演示


查看完整回答
反对 回复 2022-12-19
?
米琪卡哇伊

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)+,非贪婪的,?; 第二个是右方括号], 或空行^$. 也就是说,一堆行以包含右方括号或空行的第一行结尾。


查看完整回答
反对 回复 2022-12-19
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

您可以使用一种模式来重复标题部分下行的可能格式。

这些行以单词字符开头,后跟=一部分"..."[...]

\[\[title]]((?:\r?\n\w+\s*=\s*(?:"[^"]*"|\[[^\]\[]*]))*)

解释

  • \[\[title]]比赛[[title]]

  • (捕获组 1

    • \r?\n匹配一个换行符

    • \w+\s*=\s*匹配 1+ 个单词字符和=可选的空白字符之间

    • (?:备选方案的非捕获组

    • )关闭非捕获组

    • "[^"]*"匹配来自"..."

    • |要么

    • \[[^\]\[]*]匹配从[...]

    • (?:非捕获组

    • )*关闭非捕获组并可选择重复

    • )关闭第 1 组

    正则表达式演示


    查看完整回答
    反对 回复 2022-12-19
    ?
    胡子哥哥

    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",

    ]


    查看完整回答
    反对 回复 2022-12-19
    • 4 回答
    • 0 关注
    • 83 浏览
    慕课专栏
    更多

    添加回答

    举报

    0/150
    提交
    取消
    意见反馈 帮助中心 APP下载
    官方微信