【问题标题】:What is the Python equivalence of Perl's DOTMULTI and DOTDOTMULTIPerl 的 DOTMULTI 和 DOTDOTMULTI 的 Python 等价性是什么
【发布时间】:2016-05-29 04:10:31
【问题描述】:

我正在努力理解this perl code

并且在代码中它使用包含DOTMULTIDOTDOTMULTI 的正则表达式,例如:

#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

DOTMULTIDOTDOTMULTI 是否存在 Python 等效项?

鉴于我们知道 Python 中 Perl 中的 DOTMULTIDOTDOTMULTI 等价性,在 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。

标签: python regex string perl


【解决方案1】:

这里不涉及神奇的DOTMULTI 功能。代码插入一个字符串文字,然后在该字符串文字上锚定进一步的替换。

Python 等价物是:

text = re.sub(r'\.([\.]+)', r' DOTMULTI\1', text)

while re.search(r'DOTMULTI\.', text):
    text = re.sub(r'DOTMULTI\.([^\.])', r'DOTDOTMULTI \1', text)
    text = re.sub(r'DOTMULTI\.', 'DOTDOTMULTI', text)

所以'Some text...' 变成'Some text DOTMULTI..',然后变成'Some text DOTDOTMULTI.',然后变成'Some text DOTDOTDOTMULTI'

这段文字再次被further onwards in the same code替换为点:

#restore multi-dots
while($text =~ /DOTDOTMULTI/)
{
    $text =~ s/DOTDOTMULTI/DOTMULTI./g;
}
$text =~ s/DOTMULTI/./g;

【讨论】:

  • 所以它正在替换组外的字符串并将其放入字符串文字DOTMULTI?
  • 好的,现在我通过一些例子理解了......天哪,他们用DOTDOTDOTMULTI替换了...,就像字符串DOTDOTDOTMULTI一样。
  • 感谢@MartijnPieters!
  • @alvas:既然你在 NLP 工作,你应该知道它叫做 entitization,当你想要规范化内容时,这是一件很棒的事情,尤其是那些用户生成的内容.
猜你喜欢
  • 2012-03-20
  • 2011-02-02
  • 1970-01-01
  • 2012-02-02
  • 2023-03-25
  • 1970-01-01
  • 2010-09-18
  • 2011-03-25
  • 2023-04-04
相关资源
最近更新 更多