我正在使用以下命令在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'
答案 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 = TRUE
(R 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"
顺便说一句,如果您将参数设置为sub
的默认位置,那么您可以省略名称,让我们进行更简洁的调用:
sub("\\s((?i)Street|(?i)St\\.?)(?=\\sNE)", " St", street, perl=TRUE)