如何在正则表达式中使用数组中的关键字来搜索文件。
我正在尝试查看文本文件,看看关键字是否以及在何处出现。关键字有两个文件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循环中迭代数组中的关键字以获取匹配的关键字和位置?
感谢任何帮助。感谢
答案 0 :(得分:2)
这样做的一种方法是构建一个包含每个单词的正则表达式:
(alpha|bravo|charlie|delta|echo|foxtrot|...|zulu)
Perl的正则表达式编译器非常智能,并且可以尽可能地降低这一点,因此正则表达式将比您想象的更有效率。 See this answer by Tom Christiansen。例如以下正则表达式:
(cat|rat|sat|mat)
将编译为:
(c|r|s|m)at
哪种方式有效。这种方法可能胜过“依次搜索每个关键字”的方法,因为它只需要对输入字符串进行一次传递;天真的方法需要每个要搜索的关键字一次传递。
顺便说一下;如果你正在构建一个亵渎过滤器,正如你的示例代码所示,请记住考虑故意的错误拼写:'pron','p0rn'等。Then there's the fun you can have with Unicode!答案 1 :(得分:1)
尝试grep
:
@words = split(/\s+/, $txt);
for ($i = 0; $i < scalar(@words); ++$i) {
print "word \#$i\n" if grep(/$words[$i]/, @keywords);
}
会在找到关键字的文字字符串中为您提供单词位置。这可能比基于角色的职位更有帮助。
答案 2 :(得分:1)
我不确定您期望的输出是什么,但这样的事情可能会有用。我将关键字保存在哈希中,读取下一个文件,将每行分成单词并在哈希中搜索每一行。
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