使用Julia正则表达式有效捕获可变数量的模式?

时间:2015-08-07 20:45:02

标签: regex julia

我从巨型文本文件中提取数据,其中我感兴趣的部分看起来像

and

各部分/子部分随机分散在整个文本文件中,并具有可变数量的xy对。现在,我已阅读全文并捕获每个文本并将其添加到数据框中:

...
section:NumberOfSurvivorsPerVault
subsection:1958
xy:1_1034
xy:2_2334
subsection:1959
xy:1_1334
xy:2_2874
xy:7_12
...
section:MeanCapsPerGhoul
subsection:1962
xy:1_234
xy:2_121
....

这可以正常工作,但我认为由于两个正则表达式,它至少分配了两倍的内存,而@time显示80%的运行是gc。有没有办法可以在不制作中间副本的情况下完成这项工作? (据我所知,单个正则表达式无法做到这一点)。

1 个答案:

答案 0 :(得分:1)

这完全取决于您需要在文本文件的其余部分验证。 例如,如果您不需要语法验证,就像您确定文本文件具有正确的section-subsection-item结构一样,您可以使用此RegEx:

(?:\G|(?:\G|^section:(.*)[\r\n]+)subsection:(\d*)[\r\n]+)xy:(\d*_.*+[\r\n]+)

迭代每个 xy对

示例:

for m = eachmatch(r"(?:\G|(?:\G|^section:(.*)[\r\n]+)subsection:(\d*)[\r\n]+)xy:(\d*_.*+[\r\n]+)"m, full)
    if m.captures[2] != nothing
        sub = m.captures[2]
        if m.captures[1] != nothing
            sec = m.captures[1]
        end
    end
    item = m.captures[3]

    print("SECTION: ", sec, " -- SUBSECTION: ", sub, " -- ITEM: ", item)
end

*请原谅我,这是我第一次尝试在Julia编码。

打印:

SECTION: NumberOfSurvivorsPerVault -- SUBSECTION: 1958 -- ITEM: 1_1034
SECTION: NumberOfSurvivorsPerVault -- SUBSECTION: 1958 -- ITEM: 2_2334
SECTION: NumberOfSurvivorsPerVault -- SUBSECTION: 1959 -- ITEM: 1_1334
SECTION: NumberOfSurvivorsPerVault -- SUBSECTION: 1959 -- ITEM: 2_2874
SECTION: NumberOfSurvivorsPerVault -- SUBSECTION: 1959 -- ITEM: 7_12
SECTION: MeanCapsPerGhoul -- SUBSECTION: 1962 -- ITEM: 1_234
SECTION: MeanCapsPerGhoul -- SUBSECTION: 1962 -- ITEM: 2_121

此表达式使用\G在最后一场比赛结束时进行匹配。所以它会尝试按此顺序匹配:

  1. 如果有上一场比赛,请尝试匹配m.captures[3]中锚定到最后一场比赛结尾的 xy对,让第一和第二个捕捉组无法设置。< / p>

  2. 如果(1)不匹配,请尝试匹配m.captures[2]m.captures[3]中的子部分 xy对 },再次锚定到最后一场比赛的结束,让第一个捕捉组未设置。

  3. 尝试使用部分子部分 xy对

  4. 执行完全匹配

    此示例适用于您的主题文本,仅作为工作示例的起点,具体取决于文本文件的实际结构。考虑到如果缺少子节,它将会失败。