一部の Unicode 文字を無視し、文字以外の文字を削除します。

一部の Unicode 文字を無視し、文字以外の文字を削除します。

次のテキストがあります。

[]përgjithshme [" është "] 28.748 [< kilometra katrorë.>]

テキストには、U400~U4FFの範囲のキリル文字が含まれています。

私はアルファ以外のものを削除したいと思います。たとえば、次のようになります。 []"<> しかし、Matt Mahoneyのスクリプトを使用してPerlでこれを行う場合:http://mattmahoney.net/dc/textdata.htmlまた、次のPerl行も適用されます。

tr/a-z/ /cs;

これにより、ëなどの上記のキリル文字も削除されます。

上記の範囲に属する特定のUnicode文字を無視しながら、文字以外の文字を削除するPerlの方法はありますか?

答え1

tr/a-z/ /cs;セットにないすべての文字を空白に置き換える必要がありますa-z。 (末尾はセットを補完するためのものです。そうでなければからまでのすべての文字をc置き換えます。)az

より具体的に説明する必要があります。s/[[:punct:]]+/ /gすべての句読点文字シーケンスを単一のスペースに置き換え、s/[^[:alpha:]]+/ /gすべてのアルファベット以外の文字シーケンスを単一のスペースに置き換えます。

少なくともこれはロケールによって異なりますので、PerlにUTF-8などを[:alpha:]使用するように指示する必要があります。-Cまた、[^[:alpha:]]数字と末尾の改行も削除されます。en_US.UTF-8Debianのロケールは次のとおりです。

$ echo '[]përgjithshme [" është "] 28.748 [< kilometra katrorë.>]' | perl -C -pe 's/[^[:alpha:]]+/ /g'
 përgjithshme është kilometra katrorë $ 

$ echo '[]përgjithshme [" është "] 28.748 [< kilometra katrorë.>]' | perl -C -pe 's/[[:punct:]]+/ /g'
 përgjithshme   është   28 748   kilometra katrorë 
$ 

関連情報