是否有R函数来转义正则字符的字符串

Cor*_*one 21 regex string r

我想构建一个正则表达式代替一些字符串来搜索,所以这些字符串需要在我将它们放入正则表达式之前进行转义,这样如果搜索的字符串包含正则表达式字符,它仍然可以工作.

某些语言具有为您执行此操作的功能(例如python re.escape:https://tackoverflow.com/a/10013356/1900520).R有这样的功能吗?

例如(组成功能):

x = "foo[bar]"
y = escape(x) # y should now be "foo\\[bar\\]"
Run Code Online (Sandbox Code Playgroud)

Rya*_*son 19

我写了一个Perl quotemeta函数的R版本:

library(stringr)
quotemeta <- function(string) {
  str_replace_all(string, "(\\W)", "\\\\\\1")
}
Run Code Online (Sandbox Code Playgroud)

我总是使用regexps的perl风格,所以这适合我.我不知道它是否适用于R中的"正常"正则表达式.

编辑:我找到了解释其原因的来源.它位于perlre联机帮助页引用元字符部分:

这曾经用于一个常见的习惯用法,用于禁用或引用要用于模式的字符串中正则表达式元字符的特殊含义.只需引用所有非"单词"字符:

$pattern =~ s/(\W)/\\$1/g;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,上面的R代码是这个相同替换的直接翻译(在通过反斜杠地狱之后).该联机帮助页还说(强调我的):

与其他一些正则表达式语言不同,没有反斜杠符号不是字母数字.

这强化了我的观点,即这个解决方案只能保证PCRE.


Das*_*son 11

显然escapeRegex,在Hmisc包中调用了一个函数.函数本身对'string'的输入值有以下定义:

gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", string)
Run Code Online (Sandbox Code Playgroud)

我以前的回答:

我不确定是否有内置功能,但你可以做一个你想做的事情.这基本上只是创建了一个要替换的值的向量,以及要用它们替换它们的向量,然后循环遍历那些进行必要替换的值.

re.escape <- function(strings){
    vals <- c("\\\\", "\\[", "\\]", "\\(", "\\)", 
              "\\{", "\\}", "\\^", "\\$","\\*", 
              "\\+", "\\?", "\\.", "\\|")
    replace.vals <- paste0("\\\\", vals)
    for(i in seq_along(vals)){
        strings <- gsub(vals[i], replace.vals[i], strings)
    }
    strings
}
Run Code Online (Sandbox Code Playgroud)

一些输出

> test.strings <- c("What the $^&(){}.*|?", "foo[bar]")
> re.escape(test.strings)
[1] "What the \\$\\^&\\(\\)\\{\\}\\.\\*\\|\\?"
[2] "foo\\[bar\\]"  
Run Code Online (Sandbox Code Playgroud)

  • 您是对的,我认为它可以按预期运行。我看起来不够近,没有注意到反斜杠是列表中的第一个替换字符,并且由于反斜杠也是`gsub()`添加的唯一字符,因此您永远不会插入一个字符然后对插入。 (2认同)

Pau*_*ens 6

比 @ryanthompson 函数更简单的方法是简单地在字符串前添加\\Q和后缀。\\E请参阅帮助文件?base::regex