1

如何在正则表达式中使用数组中的关键字来搜索文件。

我正在尝试查看文本文件并查看关键字是否出现以及出现在何处。有两个文件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)

我想找到匹配的关键字和位置。这适用于一个词,但我无法弄清楚如何在正则表达式上迭代关键字。

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

一种方法是只构建一个包含每个单词的正则表达式:

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

Perl 的正则表达式编译器非常聪明,并且会尽可能地降低它,因此正则表达式将比您想象的更有效。请参阅 Tom Christiansen 的这个答案。例如以下正则表达式:

(cat|rat|sat|mat)

将编译为:

(c|r|s|m)at

哪个运行效率高。这种方法可能优于“依次搜索每个关键字”方法,因为它只需要对输入字符串进行一次传递;天真的方法需要您要搜索的每个关键字一次通过。

顺便一提; 如果您正在构建一个亵渎过滤器,正如您的示例代码所建议的那样,请记住考虑故意拼写错误:“pron”、“p0rn”等。然后您可以使用 Unicode 获得乐趣!

于 2012-04-22T19:32:50.953 回答
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 回答
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 回答