【问题标题】:Regexp to extract Spanish (maybe non-English) words in Perl正则表达式在 Perl 中提取西班牙语(可能是非英语)单词
【发布时间】:2014-10-05 05:53:13
【问题描述】:

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

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

加上一些西班牙语单词,它对英语非常有效。但后来我尝试了西班牙语,我不得不添加

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

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

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

正如你所见,它把左边的问号标记为“word”字符,而最让我困惑的是,“á”作为词尾字符。当然,普通的\w也好不了多少

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

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

【问题讨论】:

    标签: regex string perl unicode


    【解决方案1】:

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

    \b\p{L}+\b
    

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

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

    【讨论】:

    • 谢谢。适用于字符串,但不适用于文件。然而,这不是问题所在。
    【解决方案2】:

    来自 ma​​n perlre

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

    附:不要忘记use utf8 指令和相关的东西。

    【讨论】:

      【解决方案3】:

      这适用于您的示例:

      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"; 
      }
      

      【讨论】:

      • 关闭,但没有雪茄。 perldoc utf8 明确表示 Do not use this pragma for anything else than telling Perl that your script is written in UTF-8.。这意味着如果您从文件中读取文本,它将不起作用。还是谢谢!
      • 在这种情况下,使用正确的 :encoding perldoc.perl.org/functions/open.html 打开文件
      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 2023-04-07
      • 1970-01-01
      • 2013-05-13
      • 2021-10-30
      • 1970-01-01
      相关资源
      最近更新 更多