积极的前瞻性正则表达式 R

positive lookahead regex R

我正在尝试使用以下命令在 R 中进行正则表达式前瞻:

 sub(x = street.addresses, pattern = "\s((?i)Street|(?i)St\.?)(?=\sNE)", replacement = " St")

我的目标是将 Street 替换为 St,其中 Street 后跟 space 和定向 NE(如 "Northeast")。前瞻似乎再简单不过了,但我一直遇到错误:

Error in sub(x = streets, pattern = "\s((?i)Street|(?i)St\.?)(?=\sNE)",: 
invalid regular expression '\s((?i)Street|(?i)St\.?)(?=\sNE)', reason 
'Invalid regexp' 

这个没有前瞻的版本在 R 中工作正常,但是一旦我向我的 search/replace 添加任何类型的前瞻,我就遇到了错误。同样,其他正则表达式 R 函数如 grep 似乎也有同样的问题。

我已经 copied/pasted 将正则表达式表达到像 https://regex101.com/ 这样的引擎中,它似乎在那里工作得很好,所以我很困惑。我是否缺少有关 R 中正则表达式的一些基本知识?

编辑:

这是直接来自我的控制台的副本:

> street.addresses <- c("23 Charles Street NE","23 Charles St. NE")
> new.vec <- sub(x = street.addresses, pattern = "\s((?i)Street|(?i)St\.?)
(?=\sNE)", replacement = " St")
Error in sub(x = street.addresses, pattern = "\s((?i)Street|(?i)St\.?)(?
=\sNE)",  : 
invalid regular expression '\s((?i)Street|(?i)St\.?)(?=\sNE)', reason 
'Invalid regexp'

实际上,如果你想要打击,你不需要积极的前瞻:

street = c("2389 E. Myronga Street NE")
sub(x = street, pattern = "\s((?i)Street|(?i)St\.?)\sNE", replacement = " St")

输出:

sub(x = street, pattern = "\s((?i)Street|(?i)St\.?)\sNE", replacement = " St")
1 "2389 E. Myronga St NE"

但是,如果您将 PERL=TRUE 设置为附加参数

,则可以使用积极的环视(以及其他 Perl 兼容的正则表达式 (PCRE) 功能)
sub(x = street, pattern = "\s((?i)Street|(?i)St\.?)(?=\sNE)", replacement = " St", perl=TRUE)

造成这种差异的原因是,R 中使用了两种类型的正则表达式,扩展正则表达式(默认)和 perl = TRUE (R doc, see also regular-expressions.info/rlanguage) 使用的类 Perl 正则表达式.

如果你想使用前瞻,你需要在 Perl 模式下使用 sub:

street <- "123 Hudson Street NE, New York, NY"
sub(x = street, pattern = "\s((?i)Street|(?i)St\.?)(?=\sNE)",
    replacement = " St", perl=TRUE)

[1] "123 Hudson St NE, New York, NY"

Demo

顺便说一句,如果你把sub的参数放在它们的默认位置,那么你可以省略名字,给我们留下一个更简洁的调用:

sub("\s((?i)Street|(?i)St\.?)(?=\sNE)", " St", street, perl=TRUE)