RegEx для сопоставления слов перед запятыми, за исключением - PullRequest
1 голос
/ 06 мая 2019

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

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

Also there is a reinforced stone wall, a wooden wall, a stone wall, 
randomperson, a lumbering earth elemental, randomperson, randomperson,
randomperson.

(для удобства чтения разбито на несколько строк)

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

Ответы [ 2 ]

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

в программе

my $text = "Also there is a reinforced stone wall, a wooden wall, a stone wall, "
    . "randomperson, a lumbering earth elemental, randomperson, "
    . "randomperson, randomperson."

my @single_words = 
    grep { split == 1 } 
    split /\s*,|\.|\!|;\s*/, 
        ($text =~ /Also there is (.*)/)[0];

Регулярное выражение $text получает текст после этой начальной фразы, затем split возвращает список строк между запятыми (или другими пунктуацией), а grep отфильтровывает строки, содержащие более одного слова & dagger; .

В командной строке

echo "Also there is a reinforced stone wall, a wooden wall,..., randomperson,..."
| perl -wnE'say for 
    grep { split  == 1 } 
    split /\s*,|\.|\!|;\s*/, (/Also there is (.*)/)[0]'

То же, что и выше.

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


& кинжалом; & thinsp; Одинокий split использует значения по умолчанию, split ' ', $_, где ' ' - это специальный шаблон, который разбивается на \s+ и отбрасывает начальное и конечное пространство. Но в выражении split == 1 * * split находится в скалярном контексте (навязывается оператором ==, которому нужно одно значение с обеих сторон), и поэтому возвращает количество элементов в списке. , затем сравнивается с 1.

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

Код

sed -r ':a
s/, ([a-zA-Z]*)([,\.])/\n##\1\n\2/
ta
' | sed -n 's/##//gp'

Вывод

randomperson
randomperson
randomperson
randomperson

Объяснение:

Запуск цикла

sed -r ':a 

Найти все вхождения ', oneword, 'или', oneword. 'и замените ## oneword или ## oneword.## - это магический маркер для идентификации извлеченных имен позже

s/, ([a-zA-Z]*)([,\.])/\n##\1\n\2/ 

Завершение цикла

ta

Фильтрация строк на основе ## для извлечения только одной строки

' | sed -n 's/##//gp'
...