1

正規表現で配列のキーワードを使用してファイルを検索するにはどうすればよいですか。

テキスト ファイルを調べて、キーワードが表示されているかどうか、およびその場所を確認しようとしています。2つのファイルkeywords.txtがあります

keyword.txt
word1
word2
word3

filestosearchon.txt
a lot of words that go on and one and contain linebreaks and linebreaks (up to 100000   characters)

キーワードと一致する位置を見つけたいと思います。これは 1 つの単語で機能しますが、正規表現でキーワードを反復する方法がわかりません。

#!/usr/bin/perl

# open profanity list
open(FILE, "keywords.txt") or die("Unable to open file");
@keywords = <FILE>; 
close(FILE);

# open text file
local $/=undef; 
open(txt, "filetosearchon.txt") or die("Unable to open file");
$txt = <txt>;

$regex = "keyword";


push @section,[length($`),length($&),$1]    
while ($txt =~ m/$regex/g);

foreach $element(@section)  
{
print (join(", ",@$element), $regex, "\n");    
}

この while ループで配列からキーワードを反復処理して、一致するキーワードと位置を取得するにはどうすればよいですか?

どんな助けにも感謝します。ありがとう

4

3 に答える 3

3

これを行う 1 つの方法は、すべての単語を含む正規表現を構築することです。

(alpha|bravo|charlie|delta|echo|foxtrot|...|zulu)

Perl の正規表現コンパイラは非常にスマートで、これを可能な限りスムーズに処理するため、正規表現はあなたが思っているよりも効率的です。Tom Christiansen によるこの回答を参照してください。たとえば、次の正規表現:

(cat|rat|sat|mat)

次のようにコンパイルされます。

(c|r|s|m)at

これは実行するのに効率的です。このアプローチは、入力文字列を 1 回パスするだけでよいため、「各キーワードを順番に検索する」アプローチよりもおそらく優れています。単純なアプローチでは、検索するキーワードごとに 1 つのパスが必要です。

ところで; サンプル コードが示唆するように、冒涜フィルタを構築している場合は、意図的なスペルミス ('pron'、'p0rn' など) を考慮することを忘れないでください。そうすれば、Unicode を楽しむことができます!

于 2012-04-22T19:32:50.953 に答える
2

期待する出力はわかりませんが、このようなものが役立つ可能性があります。キーワードをハッシュに保存し、次のファイルを読み、各行を単語に分割し、ハッシュでそれぞれを検索します。

内容script.pl

use warnings;
use strict;

die qq[Usage: perl $0 <keyword-file> <search-file>\n] unless @ARGV == 2;

open my $fh, q[<], shift or die $!;

my %keyword = map { chomp; $_ => 1 } <$fh>;

while ( <> ) {
        chomp;
        my @words = split;
        for ( my $i = 0; $i <= $#words; $i++ ) {
                if ( $keyword{ $words[ $i ] } ) {
                        printf qq[Line: %4d\tWord position: %4d\tKeyword: %s\n], 
                                $., $i, $words[ $i ];
                }
        }
}

次のように実行します。

perl script.pl keyword.txt filetosearchon.txt

そして、出力は次のようになります。

Line:    7      Word position:    7     Keyword: will
Line:    8      Word position:    8     Keyword: the
Line:    8      Word position:   10     Keyword: will
Line:   10      Word position:    4     Keyword: the
Line:   14      Word position:    1     Keyword: compile
Line:   18      Word position:    9     Keyword: the
Line:   20      Word position:    2     Keyword: the
Line:   20      Word position:    5     Keyword: the
Line:   22      Word position:    1     Keyword: the
Line:   22      Word position:   25     Keyword: the
于 2012-04-24T13:33:36.620 に答える
2

試してくださいgrep

@words = split(/\s+/, $txt);

for ($i = 0; $i < scalar(@words); ++$i) {
    print "word \#$i\n" if grep(/$words[$i]/, @keywords);
}

キーワードが見つかったテキスト文字列内の単語の位置を示します。これは、キャラクターベースの位置よりも役立つ場合とそうでない場合があります。

于 2012-04-23T11:59:27.117 に答える