Perl을 사용하여 파일의 키워드 사이에 텍스트 추출

Perl을 사용하여 파일의 키워드 사이에 텍스트 추출

키워드 사이의 텍스트를 어떻게 추출하나요? 텍스트는 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

관련 정보