【发布时间】:2016-05-29 04:10:31
【问题描述】:
我正在努力理解this perl code。
并且在代码中它使用包含DOTMULTI 和DOTDOTMULTI 的正则表达式,例如:
#multi-dots stay together
$text =~ s/\.([\.]+)/ DOTMULTI$1/g;
while($text =~ /DOTMULTI\./)
{
$text =~ s/DOTMULTI\.([^\.])/DOTDOTMULTI $1/g;
$text =~ s/DOTMULTI\./DOTDOTMULTI/g;
}
我曾尝试在 Perl 文档中查找 DOTMULTI,但找不到任何提示。从代码 https://github.com/moses-smt/mosesdecoder/blob/master/scripts/tokenizer/tokenizer.perl 来看,只有第 270 和 258 行的 while 循环使用了 DOTMULTI。
DOTMULTI 和 DOTDOTMULTI 是否存在 Python 等效项?
鉴于我们知道 Python 中 Perl 中的 DOTMULTI 和 DOTDOTMULTI 等价性,在 Python 中会这样吗:
re.sub(r'{}\.([^\.])'.format(DOTMULTI), r'{} \1'.format(DOTDOTMULTI), text)
在 Perl 中是 this 的等价物:
$text =~ s/DOTMULTI\.([^\.])/DOTDOTMULTI $1/g;
【问题讨论】:
-
DOTMULTI只是一个字符串文字。在您的 Python 代码中,DOTMULTI是一个变量。所以,不,它不是等价物。 -
我的意思是我知道
DOTMULTI在 perl 中是什么。 -
你能解释一下你有什么输入和你期望什么输出吗?
-
在
s/\.([\.]+)/ DOTMULTI$1/g;中,DOTMULTI是一个字符串,是替换模式的一部分。此代码多次找到\.([\.]+)模式并将其替换为“DOTMULTI”+捕获组1文本(由于/g) -
它没有在你链接github.com/moses-smt/mosesdecoder/blob/master/scripts/tokenizer/…的perl代码中的任何地方初始化。在那里,字符串
DOTMULTI是要匹配的文字字符串。如果它是 perl 中的变量引用,它上面会有一个$sigil。