2013-07-05 37 views
9

目标: 我想分开单词来计算文档中的频率,然后对这些频率进行一些计算。用于匹配重音字符的正则表达式

词语可以开始/包含/结束与任何以下的:

  • 数字
  • 字母(包括电子,U,ó等,但不符号像$,#&等)

的话可包含(但不开始或者结尾)

  • 下划线(例如:rishi_dua)
  • 单引号(例如:不能)
  • 连字符(例如:123-)

的话可通过任何符号或空白等$,#,&,制表符

分离

问题:

  1. 我不能找出如何搭配é,ú,ó等没有匹配 其他特殊字符。
  2. 什么是做到这一点(可选
  3. 通过分割空间的时刻为我工作,因为没有其他

更有效的方式是什么我已经试过:

方法: 首先,我代替一切,除了\ W(字母加“_”),“和 - 与空间 后来我删除”,_和“如果这是在初学者发现nning或字 结束最后我更换单个空格多个空格和分裂的话

代码: 我使用了一系列的正则表达式替换如下:

$str =~ s/[^\w'-]/ /g; 
#Also tried using $str =~ s/[^:alpha:0-9_'-]/ /g; but doesn't work 
$str =~ s/-//; 
$str =~ s/'//; 
$str =~ s/_//; 
$str =~ s/ -/ /; 
$str =~ s/ '/ /; 
$str =~ s/ _/ /; 

$str =~ s/ +/ /; 
foreach $word (split(' ', lc $str)) { 
    #do something 
} 

约束: 我必须在Perl中完成它(因为这是我在Perl中编写的较大代码的一部分),但我可以使用除正则表达式之外的其他选项

回答

12

您可以使用\p{L}匹配所有字母的字符类。并使用\P{L}匹配所有不是字母的。

要允许报价和连字符,你可以使用:

\p{L}[\p{L}'_-]*

要匹配的分隔符,你可以使用:

[^\p{L}'_-]+(分裂)

或者更精确地说:

(?>[^\p{L}'_-]+|\B['_-]+|[-_']+\B)拆分连字符和引号不在一个字。

+1

@Rishi也看看Perl的Unicode的扩展:http://perldoc.perl.org/perlunicode.html –

+0

@Casimir,我只是试过你的代码。这不适合我。正如Eli Algranti和Jim Monty所建议的,我想这与字符编码有关。我会读它 –

+0

@Rishi Dua,你是如何解码你的输入? – ikegami

1

阅读Tom ChristiansenWhy does modern Perl avoid UTF-8 by default?的非常详细的答案。您的问题的简短答案是,您必须确保您正确地解码和编码文本,并且您必须了解如何使用Perl正则表达式模式来匹配Unicode文本。

+0

谢谢!我只注意到我用于测试的perl文件和我正在使用的实际数据文件在Notepad ++中使用不同的编码打开。我是编码的新手。会读这些东西了。谢谢 :) –