Perl:计算单词在文本中出现的次数并打印出周围的单词

时间:2014-06-25 07:04:47

标签: string perl count

我想做两件事:

1)计算给定单词在文本文件中出现的次数

2)打印出该单词的上下文

这是我目前使用的代码:

my $word_delimiter = qr{
  [^[:alnum:][:space:]]*
  (?: [[:space:]]+ | -- | , | \. | \t | ^ )
  [^[:alnum:]]*
 }x;

my $word = "hello";
my $count = 0;

#
# here, a file's contents are loaded into $lines, code not shown
#

$lines =~ s/\R/ /g; # replace all line breaks with blanks (cannot just erase them, because this might connect words that should not be connected)
$lines =~ s/\s+/ /g; # replace all multiple whitespaces (incl. blanks, tabs, newlines) with single blanks
$lines = " ".$lines." "; # add a blank at beginning and end to ensure that first and last word can be found by regex pattern below

while ($lines =~ m/$word_delimiter$word$word_delimiter/g ) {
    ++$count;
    # here, I would like to print the word with some context around it (i.e. a few words before and after it)
}

三个问题:

1)我的$ word_delimiter模式是否能捕获所有合理的字符,我可以分开单词?当然,我不想分开带连字符的单词等。[注意:我使用的是UTF-8,但只有英文和德文文字;我明白将一个词合理地分开可能是一个判断问题]

2)当要分析的文件包含"再见你好再见"之类的文本时,计数器只增加一次,因为正则表达式只匹配第一次出现的"你好"。毕竟,第二次它可以找到" hello",它之前没有另一个空格。关于如何抓住第二次出现的任何想法?我可能以某种方式重置pos()?

3)如何(合理有效地)在任何匹配的单词之前和之后打印出几个单词?

谢谢!

1 个答案:

答案 0 :(得分:0)

1。我的$word_delimiter模式是否可以捕获所有合理的字符,我可以分开单词?

  • 单词字符由字符类\w表示。它还匹配非罗马脚本中的数字和字符。
  • \W表示否定的意义(非单词字符)。
  • \b表示单词边界,且长度为零。

使用这些已经可用的字符类就足够了。

2。关于如何抓住第二次出现的任何想法?

使用零长度字边界。

while ( $lines =~ /\b$word\b/g ) {

    ++$count;
}