Extraiga texto entre palabras clave en un archivo usando Perl

Extraiga texto entre palabras clave en un archivo usando Perl

¿Cómo puedo extraer texto entre palabras clave? El texto se guarda en un archivo txt o json. La entrada es esta. "Adaptación al entorno y los desafíos del proyecto\nCapacidad para gestionar problemas, comunicaciones y habilidades de influencia,Pasión por la excelente tecnología y experiencia de usuario\nHabilidades organizativas excepcionales."

Las palabras clave son "habilidad", "habilidades" y "experiencia". El resultado debe ser el texto que se encuentra entre esas palabras clave. En este ejemplo, la salida debería ser:

para gestionar problemas, comunicaciones e influenciar Pasión por la excelente tecnología y experiencia de usuario\nOrganización excepcional

La expresión regular debe estar lista para aceptar 4 o 5 palabras clave. ¿Es posible?

Utilicé el código siguiente pero sólo funciona si el texto está en el programa en lugar de en un archivo txt. Esto sólo funcionaría para 2 palabras clave. Necesito varios.

$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/;

¿Me puedes ayudar?

Respuesta1

Creo que tienes que cambiar tu expresión regular. "\habilidad" y "\skill" probablemente no sean lo que desea. "\a" es el carácter de "campana" y "\s" es la coincidencia de un carácter de espacio en blanco.

Las partes de texto que desea capturar se pueden hacer coincidir con una parte apropiada de la expresión regular encerrada entre paréntesis. Cuando todo el RE ha encontrado una coincidencia, se puede acceder a las partes parciales coincidentes usando $1, $2, etc. Quizás... '(\w+)\s+(habilidad|skill)\s+(\w+)'

Respuesta2

Tienes muchos errores en tu script, lo he reescrito y simplificado <

#!/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;    

Salida para el ejemplo dado:

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

Explicación de expresiones regulares:

/                       # 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

información relacionada