删除非字母,同时忽略某些 unicode 字符

删除非字母,同时忽略某些 unicode 字符

我有如下文本:

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

该文本包含 U400 - U4FF 范围内的西里尔字符。

我想去掉非 alpha,例如: []"<> 但是当我使用 Matt Mahoney 的脚本在 Perl 中执行此操作时:http://mattmahoney.net/dc/textdata.html它还应用以下 Perl 行:

tr/a-z/ /cs;

这也会删除上面的西里尔字符,例如 ë。

在 Perl 中是否有一种方法可以做到这一点,即删除非字母,同时忽略属于我上面提到的范围内的某些 unicode 字符?

答案1

tr/a-z/ /cs;会要求用空格替换所有不在集合中的字符a-z。 (尾随c是为了补充该集合,否则它将替换从a到 的所有字符z。)

你必须更具体。s/[[:punct:]]+/ /g会将所有标点字符序列替换为单个空格,并将s/[^[:alpha:]]+/ /g所有非字母字符序列替换为单个空格。

请注意,至少[:alpha:]将是特定于语言环境的,并且您需要告诉 Perl 使用 UTF-8-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ë 
$ 

相关内容