Extraia texto entre palavras-chave em um arquivo usando perl

Extraia texto entre palavras-chave em um arquivo usando perl

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

informação relacionada