Como posso extrair texto entre palavras-chave? O texto é salvo em um arquivo txt ou json. A entrada é esta. "Adaptar-se ao ambiente e aos desafios do projeto\nCapacidade de gerenciar problemas, comunicações e habilidades de influência,Paixão pela excelente tecnologia e experiência do usuário\nHabilidades organizacionais excepcionais,"
As palavras-chave são “habilidade”, “habilidades” e “experiência”. A saída deve ser o texto que está entre essas palavras-chave. Neste exemplo a saída deve ser:
para gerenciar problemas, comunicações e influência Paixão por excelente tecnologia e experiência do usuário\nOrganização excepcional
A regex deve estar pronta para aceitar 4 ou 5 palavras-chave. É possível?
Usei o código abaixo mas só funciona se o texto estiver no programa ao invés de estar em um arquivo txt. Isso funcionaria apenas para 2 palavras-chave. Eu preciso de vários.
$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/;
Pode me ajudar?
Responder1
Eu acho que você tem que mudar sua expressão regular. "\ability" e "\skill" provavelmente não são o que você deseja. "\a" é o caractere de "sino" e "\s" é a correspondência de um caractere de espaço em branco.
As partes do texto que você deseja capturar podem ser combinadas com uma parte apropriada da expressão regular entre parênteses. Quando todo o RE encontrar uma correspondência, as partes parciais correspondentes podem ser acessadas usando $1, $2, etc. Talvez... '(\w+)\s+(ability|skill)\s+(\w+)'
Responder2
Você tem muitos erros no seu script, eu reescrevi e simplifiquei<
#!/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;
Saída para determinado exemplo:
$VAR1 = [
' to manage issues, communications and influencing ',
',Passion for great technology and user ',
'Exceptional organizational '
];
Explicação Regex:
/ # 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