Как извлечь текст между ключевыми словами? Текст сохраняется в файле 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