用于匹配重音字符的正则表达式

时间:2013-07-05 02:13:46

标签: regex string perl

目的: 我想分开单词来计算文档中的频率,然后对这些频率进行一些计算。

单词可以使用以下任何一项开始/包含/结束:

  • 字母(包括é,ú,ó等,但不包括$,#,&等符号)

单词可以包含(但不是以开头或结尾)

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

单词可以用任何符号或空格分隔,如$,#和&,制表符

问题:

  1. 我无法找到如何匹配é,ú,ó等而不匹配 其他特殊字符。
  2. 什么是更有效的方法(可选
  3. 由于没有其他
  4. ,现在按空间拆分对我有用

    我尝试了什么:

    方法 首先,我替换除了\ w(字母数字加“_”),'和 - 之外的所有内容 然后我删除',_和'如果在单词的开头或结尾找到它 最后,我用单个空格替换多个空格并拆分单词

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

    $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中编写的更大代码的一部分)但我可以使用除Regex之外的其他选项

3 个答案:

答案 0 :(得分:14)

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

要允许引号和连字符,您可以使用:

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

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

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

或者更确切地说:

(?>[^\p{L}'_-]+|\B['_-]+|[-_']+\B)分裂连字符和引号也不是一句话。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可能会发现此cpan模块很有趣。我以前用过它,对我来说效果很好。它可以用来简单地删除字符的重音:

http://search.cpan.org/~pjacklam/Text-Unaccent-PurePerl-0.05/lib/Text/Unaccent/PurePerl.pm