R正则表达式编译器对给定正则表达式的工作方式不同

2024-05-19 16:35:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力完善this答案;并发现下面给出的正则表达式在R中工作不正常(根据其含义)

 +?on.*$

根据我对regex的理解,上述regex符合:

lazily space one or more times followed by on followed by anything(except newline) till the end.

输入:

Posted by ondrej on 29 Feb 2020.
Posted by ona'je on 29 Feb 2020.

输出(根据我的说法,如果测试字符串中的上述正则表达式模式被替换为“”)

Posted by
Posted by 

当我试图在python (implementation here)javascriptjava (implementation here)中测试它时;我得到了我预期的结果

const myString = "Posted by ondrej on 29 Feb 2020.\nPosted by ona'je on"; console.log(myString.replace( new RegExp(" +?on.*$","gm"),""));

另一方面,如果我试图在R (implementation here)中实现相同的正则表达式;我得到的结果是

Posted by ondrej
Posted by ona'je

这是出乎意料的

怀疑

我认为R的正则表达式解析器可能工作方式不同(可能从右到左)。我阅读了关于regex如何在R中工作的文档,但发现上述regex与其他语言没有什么不同。我可能遗漏了什么。我并不精通R,但就我的正则表达式知识而言;我相信上面的正则表达式应该像它在{}、{}和{}(可能也在{})中一样适用于每个标准正则表达式引擎(据我所知)。我的问题是为什么上述正则表达式在R中的工作方式不同?


Tags: 答案byhereon方式thisfebimplementation
1条回答
网友
1楼 · 发布于 2024-05-19 16:35:24

它看起来像TRE regex engine(在基R正则表达式函数中默认使用),基于最初由Henry Spencer在1986年编写的正则表达式库,如果正则表达式中的第一个模式以惰性量词开始,以$锚点结束,则匹配字符串末尾的最短匹配

比较these cases

sub(" +?on.*$", "", Data)  # "Posted by ondrej" "Posted by ona'je"
sub(" +?on.*", "", Data)   # "Posted bydrej on 29 Feb 2020." "Posted bya'je on 29feb 2020"
sub(" +?on(.*)", "", Data) # as expected
sub(" +on.*", "", Data)    # as expected

发生了什么事

  • 第一种情况是sub(" +?on.*$", "", Data),第一种模式设置正则表达式中同一级别上所有量词的贪婪性。因此,第二个量词*将被设置为lazy,即使在没有?的情况下也是如此,因为第一个空间是用+?一个懒惰量词来量化的。这是一个已知的TRE“bug”,也存在于基于Henry Spencer的regexl库的一些其他regex引擎中

  • 第二个sub(" +?on.*", "", Data)匹配的方式与写入" +?on.*?"的方式相同(同样,由于第一个模式将贪婪级别设置为该级别上的懒惰),并且would only match1个或多个空格,然后on.*?在模式结束时不匹配任何内容

  • 第三个模式sub(" +?on(.*)", "", Data)产生了预期的结果,因为第二个量化模式.*位于另一个层次(一个层次深),其贪婪性不受另一个层次上的 +?的影响。所以,(.*)在这里非常匹配

  • 第四个模式sub(" +on.*", "", Data)产生了预期的结果,因为第一个模式是贪婪的,所以下一个量化的模式贪婪也是贪婪的

相关问题 更多 >