2015-08-07 2 views
3

Я потянув данные из гигантских текстовых файлов, в секции я заинтересован выглядеть какЭффективно захватывать переменное число шаблонов с помощью регулярного выражения Julia?

... 
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 
.... 

Разделы/подразделы случайным образом разбросаны по всему текстовому файлу и имеют переменное количество пара х. Сейчас я readall'ing полный текст и захвата каждого и добавить их к dataframe с:

function pushparametricdata(df, full) 
    for m = eachmatch(r"section:(.*)\r\nsubsection:([0-9]*)\r\n((xy:[0-9]*_.*?\r\n)+)"m, full) 
     for r = eachmatch(r"xy:([0-9]+)_(.*?)\r\n"m, m.captures[3]) 
      push!(df, [m.captures[1], int(m.captures[2]), int(r.captures[1]), float(r.captures[2])]) 
     end 
    end 
end 

Это хорошо работает, но я думаю, что это выделяет, по крайней мере в два раза больше памяти, чем это необходимо в связи с два регулярных выражения и @time показывает, что 80% пробега - gc. Можно ли это сделать без промежуточной копии? (Из того, что я могу сказать, это невозможно сделать с помощью одного регулярного выражения).

+0

Вы можете попытаться использовать только ['(? M) (?:^| \ G) xy: ([0-9] +) _ (. *)'] (Https: // regex101.com/r/nN9tB5/2): 'function pushparametricdata (df, full) для m = eachmatch (r" (? m) (?:^| \ G) xy: ([0-9] +) _ (. *) «m, full) push! (df, [m.captures [1], int (m.captures [2]), int (r.captures [1]), float (r.captures [2]) ]) конец конец'. Вот [демонстрация, показывающая, что я имею в виду] (http://goo.gl/EMe3lj). –

+0

Хорошая мысль, но я боюсь, что у меня много разных разделов, и у каждого есть разные числа xy-пар и подразделов. – ARM

+0

Хорошо, как насчет оптимизации первого регулярного выражения? Попробуйте секцию '' (? S): (. *?) Подраздел: ([0-9] +) \ s + ((?:: yy: [0-9] * _ [^ \ n] + \ r? \ N) +) '] (https://regex101.com/r/nN9tB5/5). Второе регулярное выражение может быть 'xy: ([0-9] +) _ ([^ \ n] *)'. –

ответ

1

Все зависит от того, что вам нужно проверить на остальной части текстового файла. Например, если вам не нужен синтаксис проверки, как вы знаете наверняка, что текстовый файл имеет правильную структуру раздела-п-пункт, вы можете использовать этот 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 

* Пожалуйста, простите меня, это первый раз, когда я пытаюсь кодирования в Джулию.

Печать:

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] прикрепленного к концу последнего матча, в результате чего первый и второй отлов группа снята с охраны ,

  2. Если (1) не совпадает, попробуйте подобрать как подраздела и х пару в m.captures[2] и m.captures[3], снова привязываются к концу последнего матча, в результате чего 1-й группы захвата снят с охраной.

  3. Попробуйте выполнить полный матч с раздела, подраздел и пары ху

Этот пример будет работать на вашей тематике текста, и служит лишь в качестве отправной точки для рабочий пример в зависимости от фактической структуры ваших текстовых файлов. Примите во внимание, что он потерпит неудачу, если у вас есть подразделы, отсутствующие, например.

Смежные вопросы