RegEx для соответствия слов перед запятыми (Lua) - PullRequest
1 голос
/ 06 мая 2019

Раздел текста, на который я нацеливаюсь, всегда начинается с «Также есть» и заканчивается точкой.Одиночные имена между запятыми - это то, на что я пытаюсь ориентироваться (например, «randomperson» в приведенном ниже примере. Эти имена всегда будут разными. Это сложно, потому что есть другие вещи, которые не являются одним словом «names». Может быть,Я могу сопоставить все, что находится между запятыми, ТОЛЬКО ЕСЛИ это одно слово / имя, но я не могу понять, что это одно. Список имен может быть намного длиннее или даже короче, поэтому выражение должно быть динамическим, а не просто соответствоватьустановить количество имен.

Целевой текст:

Также есть усиленная каменная стена, деревянная стена, каменная стена, случайный человек, неуклюжий элементаль земли, случайный человек, случайный человек,randomperson.

Группа 1 из: Also there is (.*).

Целевая все после "есть", но затем мне нужно как-то изолировать отдельные слова.

Какрешить эту проблему?

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Вы можете сделать:

s = "Also there is a reinforced stone wall, a wooden wall, a stone wall, randomperson, a lumbering earth elemental, randomperson, randomperson, randomperson."
str = s:sub(15,-2)
things = {}
start = 1
while true do
  a, b = str:find("[^,]+", start)
  if not a then break end
  table.insert(things, str:sub(a, b))
  start = b + 3
end
for _,thing in ipairs(things) do print("-> " .. thing) end

, который выводит

-> a reinforced stone wall
-> a wooden wall
-> a stone wall
-> randomperson
-> a lumbering earth elemental
-> randomperson
-> randomperson
-> randomperson

Или установить модуль luarocks split , и это так же просто, как

split = require("split")
things = split.split(s:sub(15,-2), ", ")

Использование gmatch:

for thing in s:sub(14, -2):gmatch("%f[%S][^,]+") do print(thing) end

Я использую там шаблон "границы", чтобы отбросить пробел, следующий за запятой.

0 голосов
/ 08 мая 2019

Я не совсем уверен относительно направления вопроса, но проблема может быть слишком сложной для регулярных выражений, не говоря уже о шаблонах Lua. А так как мне нравятся грамматики - вот немного LPeg :

local l = require "lpeg";
local V, P, R, S = l.V, l.P, l.R, l.S;
local OUT = function(T, ... ) return function(...) print(T, ...) end end

local g = P{ "S",
    S = 'Also there is ' * V'List' * '.',
    List = V'Item' * (P',' * ' ' * V'Item')^0,
    Item = V'Specific_Noun' + V'Name',
    Name = V'Word'                                                   /OUT'Name',
    Specific_Noun = (P'a' + 'an') * ' ' * (V'Word' * ' ')^0 * V'Noun',
    Noun = V'Word'                                                   /OUT'Noun',
    Word = R('az','AZ')^1,
}

g:match("Also there is a reinforced stone wall, a wooden wall, a stone wall, "..
"randomperson, a lumbering earth elemental, randomperson, randomperson, rando"..
"mperson, Karl, Greta, a mile.")

Пример вывода:

Noun    wall
Noun    wall
Noun    wall
Name    randomperson
Noun    elemental
Name    randomperson
Name    randomperson
Name    randomperson
Name    Karl
Name    Greta
Noun    mile

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

...