繁体   English   中英

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

[英]Regex for matching accent characters

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

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

  • 数字
  • 字母表(包括é,ú,ó等,但不是符号,如$,#,等)

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

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

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

问题:

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

我尝试过的:

方法:首先我替换除了\\ 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之外的其他选项

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

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

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

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

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

或者更确切地说:

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

阅读Tom Christiansen对于为什么现代Perl默认避免使用UTF-8的非常详细的答案 对您的问题的简短回答是,您必须确保正确解码和编码文本,并且必须了解如何使用Perl正则表达式模式来匹配Unicode文本。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM