积极的前瞻性正则表达式 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"
顺便说一句,如果你把sub
的参数放在它们的默认位置,那么你可以省略名字,给我们留下一个更简洁的调用:
sub("\s((?i)Street|(?i)St\.?)(?=\sNE)", " St", street, perl=TRUE)
我正在尝试使用以下命令在 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
设置为附加参数
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"
顺便说一句,如果你把sub
的参数放在它们的默认位置,那么你可以省略名字,给我们留下一个更简洁的调用:
sub("\s((?i)Street|(?i)St\.?)(?=\sNE)", " St", street, perl=TRUE)