使用perl或python将阿拉伯字符"ا"替换为一个单词中的"a",但将"ә"替换为另一个单词

Sha*_*ane 9 python regex perl arabic

我需要将纯文本UTF8文档从R语言更改为L语言到拉丁语言.不幸的是,它并不像角色字符音译那么容易.
例如,取决于单词构成,R到L语言(ا)中的"a"可以是"a"或"ә".

在使用ag,k,e或hamza(گ,ك,ە,ء)的单词中,
我需要将所有a,o,i,u(ا,و,ى,ۇ)更改为拉丁语ә,ѳ,i, ü(称为"软"元音).
例如.سالەم成为sәlêm,ءۇي变成üy,سوزمەن成为sѳzmên

在没有ag,k,e或hamza(گ,ك,ە,ء)
的单词中,a,o,i,u变为拉丁字符a,o,i,u(称为"硬"元音).
例如.الما成为alma,becomes成为ul,ورتا成为orta.

实质上,
g,k,e或hamza充当阿拉伯语脚本中的发音指南.
在拉丁语中,我需要两组不同的元音,具体取决于阿拉伯语脚本中的原始单词.

我想我可能需要将"软"元音词作为第一步,然后对文档的其余部分进行单独的查找和替换.但是,如何使用perl或python进行这样的查找和替换呢?

这是一个unicode示例:\ U + 0633\U + 0627\U + 0644\U + 06D5\U + 0645\U + 0648\U + 0631\U + 062A\U + 0627\U + 0674\U + 06C7\U + 064A\U + 0633\U + 0648\U + 0632\U + 0645\U + 06D5\U + 0645\U + 0627\U + 0644\U + 0645\U + 0627\U + 06C7\U +0644\U + 0645\U + 06D5\U + 0646\U + 0649\U + 06AD\U + 0627\U + 062A\U + 0649\U + 0645\U + 0634\U + 0627\U + 0644\U + 0642\U + 0627\U + 0631.

它应该看起来像:"sәlêmortaüysѳzmênalmaulmêningatentimalқar".(注意:字母ڭ,即U + 06AD实际上最终为两个字母,n + g,以产生"-ng"声).它看起来不应该像"salêmortauysozmênalmaulmêningatimalқar",也不应该像"sәlêmѳrtәüysѳzmênәlmәülmêningәtimxәlқәr".

非常感谢任何帮助.

jfs*_*jfs 4

命令:

\n\n
$ echo \xd8\xb3\xd8\xa7\xd9\x84\xdb\x95\xd9\x85 \xd9\x88\xd8\xb1\xd8\xaa\xd8\xa7 \xd8\xa1\xdb\x87\xd9\x8a \xd8\xb3\xd9\x88\xd8\xb2\xd9\x85\xdb\x95\xd9\x86 \xd8\xa7\xd9\x84\xd9\x85\xd8\xa7 \xdb\x87\xd9\x84 \xd9\x85\xdb\x95\xd9\x86\xd9\x89\xda\xad \xd8\xa7\xd8\xaa\xd9\x89\xd9\x85 \xd8\xb4\xd8\xa7\xd9\x84\xd9\x82\xd8\xa7\xd8\xb1 | ./arabic-to-latin\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
s\xd3\x99l\xc3\xaam orta \xc3\xbcy s\xd1\xb3zm\xc3\xaan alma ul m\xc3\xaaning atim xal\xd2\x9bar\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用文件代替 stdin/stdout:

\n\n
$ ./arabic-to-latin input_file_with_arabic_text_in_utf8 >output_latin_in_utf8\n
Run Code Online (Sandbox Code Playgroud)\n\n

文件所在arabic-to-latin

\n\n
#!/usr/bin/perl\nuse strict;\nuse warnings;\nuse utf8;\nuse open qw(:std :utf8);\n#XXX normalization\n\nsub replace_word {\n    my ($word) = @_;\n    $_ = $word;\n    if (/\xd8\xa1|\xdb\x95|\xd9\x83|\xda\xaf/) { # g, k, e, or hamza in the word\n        tr/\xd8\xa7\xd9\x88\xd9\x89\xdb\x87/\xd3\x99\xd1\xb3i\xc3\xbc/; # soft\n    } else {\n        tr/\xd8\xa7\xd9\x88\xd9\x89\xdb\x87/aoiu/; # hard\n    }\n    tr/\xd8\xb3\xd9\x84\xdb\x95\xd9\x85\xd8\xb1\xd8\xaa\xd8\xb2\xd9\x86\xd8\xb4\xd9\x82/sl\xc3\xaamrtznx\xd2\x9b/;\n    s/\xd8\xa1\xc3\xbc\xd9\x8a/\xc3\xbcy/g;\n    s/\xda\xad/ng/g;\n    $_;\n}\n\nwhile (my $line = <>) {\n    $line =~ s/(\\w+)/replace_word($1)/ge;\n    print $line;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

使arabic-to-latin文件可执行:

\n\n
$ chmod +x ./arabic-to-latin\n
Run Code Online (Sandbox Code Playgroud)\n