Extrahieren Sie mit Perl Text zwischen Schlüsselwörtern in einer Datei

Extrahieren Sie mit Perl Text zwischen Schlüsselwörtern in einer Datei

Wie kann ich Text zwischen Schlüsselwörtern extrahieren? Der Text wird in einer txt- oder json-Datei gespeichert. Die Eingabe lautet: „An die Umgebung und die Herausforderungen des Projekts anpassen\nFähigkeit, Probleme zu bewältigen, Kommunikation und Überzeugungskraft, Leidenschaft für großartige Technologie und Benutzererfahrung\nAußergewöhnliche organisatorische Fähigkeiten“,

Die Schlüsselwörter sind „Fähigkeit“, „Fertigkeiten“ und „Erfahrung“. Die Ausgabe sollte der Text sein, der zwischen diesen Schlüsselwörtern steht. In diesem Beispiel sollte die Ausgabe sein:

um Probleme, Kommunikation und Einflussnahme zu managen Leidenschaft für großartige Technologie und Benutzererfahrung\nAußergewöhnliche organisatorische

Der reguläre Ausdruck muss 4 oder 5 Schlüsselwörter akzeptieren können. Ist das möglich?

Ich habe den untenstehenden Code verwendet, aber er funktioniert nur, wenn der Text im Programm und nicht in einer txt-Datei ist. Dies würde nur für 2 Schlüsselwörter funktionieren. Ich brauche mehrere.

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

Kannst du mir helfen?

Antwort1

Ich denke, Sie müssen Ihren regulären Ausdruck ändern. „\ability“ und „\skill“ sind wahrscheinlich nicht das, was Sie wollen. „\a“ ist das Zeichen für „Glocke“ und „\s“ entspricht einem Leerzeichen.

Die Textteile, die Sie erfassen möchten, können mit einem geeigneten Teil des regulären Ausdrucks abgeglichen werden, der in Klammern eingeschlossen ist. Wenn der gesamte RE eine Übereinstimmung gefunden hat, können die teilweise übereinstimmenden Teile mit $1, $2 usw. abgerufen werden. Vielleicht ... '(\w+)\s+(Fähigkeit|Fertigkeit)\s+(\w+)'

Antwort2

Ihr Skript enthält viele Fehler. Ich habe es umgeschrieben und vereinfacht.

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

Ausgabe für das angegebene Beispiel:

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

Regex-Erklärung:

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

verwandte Informationen