2013-07-05 78 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 ++中使用不同的編碼打開。我是編碼的新手。會讀這些東西了。謝謝 :) –