Перейти к содержанию
  • записи
    104
  • комментариев
    125
  • просмотров
    15 460

Lua поиск элемента до и после строки


MasterGH

1 797 просмотров

Была задача получить два списка из документа, в котором было с пару десятков тысяч строк. На практике выяснилось, что искать текст после ключевого слова легче чем искать текст до ключевого слова. Об этом и будет дальше

 

В утилите, которую я делал "Lua Regular Expressions (v. 1.0)"

image.png

 

Текст во вкладке "gmatch"

 

Game1
gameCompany
DAU
53.21k
-20%

Game2
gameCompany
DAU
20.35k
-20%

 

Поиск элемента после строки

 

"DAU "DAU%c%c(.-)%c%c""
 > 53.21k;20.35k;

 

Поиск элемента до строки

Вот такой паттерн со двигом скобок для поиска прыдыдущеей фразы

 

"%c%c(.-)gameCompany%c%c"

 

не прокатит для вывода списка игр над фразой gameCompany
  
 > ;53.21k
 > -20%
 > 
 > Game2
 > ;

 

Очевидно, можно сделать поиск по похожим фрагментам, которые идут последовательно сверху вниз. 

 

Для просты сначала добавим первую пустую строку и видим повторяющиеся фрагменты

 

%c%cGame1%c%cgameCompany%c%c

 

пишем шаблон ".*%c%c(.-)%c%cgameCompany%c%c" и опять мимо

 

 > Game1;53.21k
 > -20%
 > 
 > Game2;

 

Потому что текст над Game2 пошел выше Game2. Тогда делаем захват, только первой фразы и дальше не идем

 

"%c%c(%w-)%c%cgameCompany%c%c"
 > Game1;Game2;
 
И тогда все ок.

 

Но это еще не все. Осталась первая пустая строка, которую добавили, если её удалить, тогда

 

"%c%c(%w-)%c%cgameCompany%c%c"
 > Game2;
 
 Не видит Game1.
 
 Значит мы можем  убрать %c%c,
 
 "(%w-)%c%cgameCompany
 > Game1;Game2;

 

Дальше название игры может быть таким "My Game: my Game". Здесь и пробел и двоеточие. В таком случае текст уже будет
 
My Game1: my Game
gameCompany
DAU
53.21k
-20%

My Game2: my Game
gameCompany
DAU
20.35k
-20%

 

Пробуем

(%w-)%c%cgameCompany

> Game;Game;

 

Что не верно, т.к. захват одним (%w-)

 

Мы должны в скобках развернуть фразу имени игры. В ней могут быть пробелы, числа, текст и двоеточие

 

([%w%s]-)%c%cgameCompany
>  my Game; my Game;

 

Затем


([:%w%s]-)%c%cgameCompany


> My Game1: my Game;

> My Game2: my Game;

 

Затем
%c?%c?([:%w%s]-)%c%cgameCompany


> My Game1: my Game;
> My Game2: my Game;
 

Вот и все. Если  попариться один раз, то тексты уже парсить будет гораздо быстрее.

 

Так я вывел столбы DAU и названий игр в таблицу, что было в районе 500 строк из пару десятков тысяч строк

 

p.s. Текст в консоли Lua отличается %c%c, а %с

p.s.p.s. Можно разсплитить текст по "/n/r" или "/n" в таблицу строк и по индексам данных находить предыдущую или последующую фразу. Но мне проще две строки ввести "%c?%c?([:%w%s]-)%c%cgameCompany" и "DAU%c%c(.-)%c%c"

  • Понравилось 1

3 Комментария


Рекомендуемые комментарии

Если я правильно понял про positive lookahead, то такого в Lua нет

image.png

 

Можно через gsub пытаться, но мне такой вариант не нравится

Ссылка на комментарий

Да, оно самое. Чрезвычайно полезная штука, когда нужно выловить что-то перед чем-то определенным (ну или подпадающим под паттерн).

Ссылка на комментарий

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.