Извлечь текст между ключевыми словами в файле с помощью Perl

Извлечь текст между ключевыми словами в файле с помощью Perl

Как извлечь текст между ключевыми словами? Текст сохраняется в файле txt или json. Входные данные следующие. "Адаптация к среде и задачам проекта\nСпособность управлять проблемами, коммуникациями и навыками влияния,Страсть к отличным технологиям и пользовательскому опыту\nИсключительные организационные навыки,"

Ключевые слова — «способность», «навыки» и «опыт». Вывод должен представлять собой текст, который находится между этими ключевыми словами. В этом примере вывод должен быть следующим:

управлять проблемами, коммуникациями и оказывать влияние. Страсть к отличным технологиям и пользовательскому опыту.\nИсключительная организационная способность.

Регулярное выражение должно быть готово принять 4 или 5 ключевых слов. Это возможно?

Я использовал код ниже, но он работает только если текст находится в программе, а не в txt-файле. Это сработает только для 2 ключевых слов. Мне нужно несколько.

$file = 'C:\Users\Acer Nitro\Desktop\perl\sim.txt';

open(SESAME, $file);
while(<SESAME>)
{
    $text .= $_;
}

close(SESAME);
print $text;

($re=$text)=~s/((\bskill\b)|(\bability\b)|.)/${[')','']}[!$3]\Q$1\E${['(','']}[!$2]/gs;
@$ = (eval{/$re/},$@);
print join"\n",@$ unless $$[-1]=~/unmatched/;

Вы можете помочь мне?

решение1

Я думаю, вам следует изменить регулярное выражение. «\ability» и «\skill» — это, вероятно, не то, что вам нужно. «\a» — это символ для «bell», а «\s» — это соответствие символу пробела.

Текстовые части, которые вы хотите захватить, могут быть сопоставлены с соответствующей частью регулярного выражения, заключенного в скобки. Когда все RE найдет соответствие, к частичным сопоставленным частям можно будет получить доступ с помощью $1, $2 и т. д. Возможно... '(\w+)\s+(ability|skill)\s+(\w+)'

решение2

У вас в сценарии много ошибок, я его переписал и упростил<

#!/usr/bin/perl 
use strict;
use warnings;
use Data::Dumper;

# file to search
my $file = 'C:\Users\Acer Nitro\Desktop\perl\sim.txt';
open my $fh, '<', $file or die "unable to open '$file' for reading: $!";
# read whole file in a single string
undef $/;
my $full = <$fh>;
# search text between keywords
my @found = $full =~ /\b(?:ability|skills|experience)\b\R?\K(.+?)(?=\b(?:ability|skills|experience)\b)/gsi;
# dump the result
print Dumper\@found;    

Вывод для данного примера:

$VAR1 = [
          ' to manage issues, communications and influencing ',
          ',Passion for great technology and user ',
          'Exceptional organizational '
        ];

Объяснение регулярного выражения:

/                       # regex delimiter
    \b                  # word boundary
    (?:                 # non capture group
        ability         # literally
      |                 # OR
        skills          # literally
      |                 # OR
        experience      # literally
    )                   # end group
    \b                  # word boundary
    \R?                 # optional linebreak
    \K                  # forget all we have seen until this position
    (.+?)               # group 1, the text we want
    (?=                 # positive lookahead
        \b              # word boundary
        (?:             # non capture group
            ability     # literally
          |             # OR
            skills      # literally
          |             # OR
            experience  # literally
        )               # end group
        \b              # word boundary
    )                   # end lookahead
/gsi                    # delimiter, global; dot matches newline; case insensitive

Связанный контент