正则表达式在Perl中提取西班牙语(可能是非英语)单词

时间:2014-08-12 08:33:00

标签: regex string perl unicode

一句话是什么?或者更好,什么是一个词? 到目前为止,我一直在使用字符组从文本中提取单词。原始文本处于降价状态,因此使用单词处理可能比标记它们更好。此外,使用单词避免任何类型的标记,所以它更通用。我正在使用this text作为测试。 在将该文本添加到测试套件之前,我正在使用此正则表达式:

our $word_re = qr/([\w\'áéíóúÁÉÍÓÚñÑçÇüÜ]+)/
my ($stripped_word) = ( $w =~ $word_re );

它几乎适用于英语,并带有一些西班牙语单词。但后来我尝试了西班牙语,我不得不添加

 ($stripped_word) = ( $stripped_word =~ /([^¿!ªº\d]+)/ ); #Some Spanish sigils and digits

照顾左标点符号和更多东西。 一般的问题是,即使这适用于英语和西班牙语(到目前为止),这是一个黑客,它可能不适用于冰岛语,捷克语或达尔马提亚语。所以我测试了包含Unicode字符类的regexen,但结果如下:

x ( "¿Más o menos?" =~ /(\p{Word}+)/g )
0  '¿'
1  'Má'
2  's'
3  'o'
4  'menos'

正如你所看到的那样,在左侧问号上标记为“单词”字符,最让我感到困惑的是,“á”作为一个词尾字符。当然,普通\w并不是更好

 x ( "¿Más o menos?" =~ /(\w+)/g )
0  'M'
1  's'
2  'o'
3  'menos'

所以,最后一个问题是:是否有一个(最好是短的)正则表达式能够提取(合理)数量的语言?或者最好的方法是首先使用您感兴趣的语言中的字符枚举来提取类似于词的内容,然后将它们剥离出实际上真实角色的内容?

3 个答案:

答案 0 :(得分:2)

来自 man perlre

  

\w匹配单个字母数字字符(字母   字符或十进制数字)或_,而不是一个完整的单词。使用\w+来   匹配一串Perl标识符字符(与...不同)   匹配英文单词)。如果“使用区域设置”生效,则列表为   \w生成的字母字符取自当前字符   语言环境。请参阅perllocale

P.S。不要忘记use utf8指令及相关内容。

答案 1 :(得分:2)

perlunicode - Unicode character properties中所定义,提取仅包含任何语言字母的单词:

\b\p{L}+\b

如果单词还包含数字,请使用:

\b[\p{L}\p{Nd}]+\b

答案 2 :(得分:2)

这适用于您的示例:

use utf8; 
use strict;
use warnings;

my $str = "¿Más o menos?";

my @fields = $str =~ m/(\p{Word}+)/g;

foreach my $f(@fields) {
    print $f, "\n"; 
}