使用perl或python替换阿拉伯字符ا&引用;加上;a「;一句话,但是ә&引用;换言之

使用perl或python替换阿拉伯字符ا&引用;加上;a「;一句话,但是ә&引用;换言之,python,regex,perl,arabic,Python,Regex,Perl,Arabic,我需要将纯文本UTF8文档从R语言更改为L语言,再更改为拉丁语言。不幸的是,这不像一个字符的音译那么容易。 例如,R到L语言(ا)中的“a”可以是“a”或“ә”,具体取决于单词的构成 用带有g、k、e或hamza(گ،ك،ە،ء)的单词表示 我需要把所有的a,o,I,u(ا،و،ى،ۇ)改成拉丁字母ә,ѳ,I,ü(称为“软”元音)。 比如说,当一个人变成了一个人,当一个人变成了另一个人,当一个人变成了另一个人,当一个人变成了另一个人 用不带g、k、e或hamza(گ،ك،،ء)的文字表示 a、o

我需要将纯文本UTF8文档从R语言更改为L语言,再更改为拉丁语言。不幸的是,这不像一个字符的音译那么容易。
例如,R到L语言(ا)中的“a”可以是“a”或“ә”,具体取决于单词的构成

用带有g、k、e或hamza(گ،ك،ە،ء)的单词表示
我需要把所有的a,o,I,u(ا،و،ى،ۇ)改成拉丁字母ә,ѳ,I,ü(称为“软”元音)。
比如说,当一个人变成了一个人,当一个人变成了另一个人,当一个人变成了另一个人,当一个人变成了另一个人

用不带g、k、e或hamza(گ،ك،،ء)的文字表示
a、o、i、u变为拉丁字符a、o、i、u(称为“硬”元音)。
例如,成为阿尔玛,成为ul,成为奥尔塔

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

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

这里有一个统一的例子:一个统一的例子是一个统一的统一的例子:一个统一的例子是一个统一的统一的例子:一个统一的例子是一个统一的例子:一个统一的统一的例子:U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0633\U+0627\U+0627\U+0627\U+0627\U+0627\U+0633\U+U+U+0+0+0+0+0+0+0+0+0645\U+0645\U+0645\U+0645\\U+0642\U+0627\U+0631

结果应该是这样的:“sәlêm ortaüy sѳzmên alma ul mêning atim xalқar”(注意:字母ڭ,即U+06AD实际上以两个字母n+g结尾,发出“-ng”的声音)。它不应该看起来像“萨勒姆·奥尔塔·乌苏兹曼·阿尔玛·乌尔·明宁·阿提姆·沙拉尔”,也不应该像“萨勒姆·里尔特·苏兹姆·勒姆·穆宁·蒂姆·沙拉尔”


非常感谢您的帮助。

我不会说perl或python(或阿拉伯语),但这是您可以使用的基本思想(使用Javascript,但应该可以翻译为任何已替换为回调的语言):

//将[a-z]替换为阿拉伯语的正确unicode范围
输入.替换(/[a-z]+/,函数(word){
//将“[gkeh]”替换为其阿拉伯语对应词
如果(/[gkeh]/.test(word){
返回字。替换(/。/,函数(c){
用软元音返回[c]
})
}否则{
返回字。替换(/。/,函数(c){
返回硬元音[c]
})
}
})
也就是说,将输入拆分为单词,然后根据该单词是否包含特定字符,使用两个翻译表中的一个替换该单词中的每个符号。正则表达式可以同时用于这两个表中,也可以按单词边界拆分并在单词中进行替换(同时使用相当于
indexOf
的分支)

以下是无回调的方法(如果Javascript中的字符串是可变的):

var words=input.split(“”);
var表;

对于(var i=0;i,此python代码基于Jan Dvorak的代码,应该提供一个起点:

import re
import codecs

def replace_word(word):
    if re.search(ur'[gkeh]', word):
        # hard vowels
        word = word.replace(u'a', u'ә')
        word = word.replace(u'o', u'ѳ')
        word = word.replace(u'i', u'i')
        word = word.replace(u'u', u'ü')
    else:
        # soft vowels
        word = word.replace(u'a', u'a')
        word = word.replace(u'o', u'o')
        word = word.replace(u'i', u'i')
        word = word.replace(u'u', u'u')
    return word

with codecs.open('input.txt', 'w', 'utf-8') as fh:
    input = fh.read()

output = re.sub(ur'(\S+)', lambda m: replace_word(m.group(1)), input)

with codecs.open('output.txt', 'w', 'utf-8') as fh:
    fh.write(output)

你可以用序数映射建立你自己的翻译表来替换字符,对于每一组字符,你需要一个单独的表(用于元音)。这只是一个局部的例子,但应该给你一个方法


请注意,您需要为其他字符指定翻译表。如果需要,还可以将一个阿拉伯文字符翻译为多个拉丁文字符。如果将输出与请求进行比较,则翻译表中的所有字符似乎都匹配正确

import re

s1 = {u'ء',u'ە',u'ك',u'گ'} # g, k, e, hamza

t1 = {ord(u'ا'):u'ә',  # first case
      ord(u'و'):u'ѳ',
      ord(u'ى'):u'i',
      ord(u'ۇ'):u'ü',
      ord(u'ڭ'):u'ng'} # with double

t2 = {ord(u'ا'):u'a',  # second case
      ord(u'و'):u'o',
      ord(u'ى'):u'i',
      ord(u'ۇ'):u'u',
      ord(u'ڭ'):u'ng'} # with double

def subst(word):    
    if any(c in s1 for c in word):
        return word.translate(t1)
    else:
        return word.translate(t2)

s = u'سالەم ورتا ءۇي سوزمەن الما ۇل مەنىڭ اتىم شالقار'

print re.sub(ur'(\S+)', lambda m: subst(m.group(1)), s)

# output:    سәلەم oرتa ءüي سѳزمەن aلمa uل مەنing aتiم شaلقaر

# requested: sәlêm orta üy sѳzmên alma ul mêning atim xalқar
命令:

$ echo سالەم ورتا ءۇي سوزمەن الما ۇل مەنىڭ اتىم شالقار | ./arabic-to-latin
输出:

sәlêm orta üy sѳzmên alma ul mêning atim xalқar
要使用文件而不是标准输入/标准输出,请执行以下操作:

$ ./arabic-to-latin input_file_with_arabic_text_in_utf8 >output_latin_in_utf8
其中
阿拉伯文到拉丁文
文件:

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use open qw(:std :utf8);
#XXX normalization

sub replace_word {
    my ($word) = @_;
    $_ = $word;
    if (/ء|ە|ك|گ/) { # g, k, e, or hamza in the word
        tr/اوىۇ/әѳiü/; # soft
    } else {
        tr/اوىۇ/aoiu/; # hard
    }
    tr/سلەمرتزنشق/slêmrtznxқ/;
    s/ءüي/üy/g;
    s/ڭ/ng/g;
    $_;
}

while (my $line = <>) {
    $line =~ s/(\w+)/replace_word($1)/ge;
    print $line;
}

你试过使用正则表达式吗?我一直在尝试正则表达式(regex,对吗?),但我一辈子都不知道如何正确构造查询。从这个意义上说,regex、perl、python,甚至其他解决方案都很好。一个由问题中的单词组成的小片段(加上一些额外内容)18月15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 Python没有回调,但您只需执行
text.split()
获取一个单词序列,然后对该序列进行迭代。@Bakuriu Python确实有回调。它甚至可以用于函数。我该如何使用它?我是否将其放入文件中,命名,然后从终端运行它(我在Mac上)?@Shane这是用javascript编写的。您需要将其翻译成python或perl,添加文件读/写例程,并执行指定的字符类替换,以及准备
软表
硬表
。只有懂python和阿拉伯语的人才能为您编写一个现成的脚本,包括g转换表。我的目的是向您展示逻辑。@JanDvorak我理解,非常感谢。我可以用谷歌搜索您提到的内容,看看我可以开发什么。我是否可以将其复制到文件名it convertor.py中,然后运行“python convertor.py”从终端?我该如何使用它?@Shane您仍然需要将其转换为使用阿拉伯语作为源代码,并添加辅音替换(并将
[gkeh]
和元音替换为其阿拉伯语对应项)。@JanDvorak我在想,如果它作为一个文件工作,我可以从命令行运行(需要调整),然后我会在像Mellel这样的文字处理器中打开文档,对其余的字符进行查找和替换,这将是当时的字符。@Shane如果你想先音译,然后替换元音,你可以,如果应该替换的内容的信息没有随音译而丢失的话。我如何使用t他的?我要把它放进一个文件,命名,然后从termi运行它吗
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use open qw(:std :utf8);
#XXX normalization

sub replace_word {
    my ($word) = @_;
    $_ = $word;
    if (/ء|ە|ك|گ/) { # g, k, e, or hamza in the word
        tr/اوىۇ/әѳiü/; # soft
    } else {
        tr/اوىۇ/aoiu/; # hard
    }
    tr/سلەمرتزنشق/slêmrtznxқ/;
    s/ءüي/üy/g;
    s/ڭ/ng/g;
    $_;
}

while (my $line = <>) {
    $line =~ s/(\w+)/replace_word($1)/ge;
    print $line;
}
$ chmod +x ./arabic-to-latin