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

时间:2018-01-07 03:04:35

标签: r regex lookahead

我正在使用以下命令在R中尝试正则表达式预测:

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

我的目标是用St替换街道,然后是空格和方向NE(如,"东北")。似乎前瞻不是更直截了当但我一直在犯错误:

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中工作正常,但只要我在搜索/替换中添加任何类型的前瞻,我就会遇到错误。同样,像grep这样的其他正则表达式R函数似乎也有同样的问题。

我已将正则表达式复制/粘贴到像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'

2 个答案:

答案 0 :(得分:2)

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

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 = TRUER doc使用的扩展正则表达式(默认)和类似Perl的正则表达式,另请参阅regular-expressions.info/rlanguage)。

答案 1 :(得分:1)

如果要使用前瞻,则需要在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)