Есть ли функция R, чтобы избежать строки для символов регулярных выражений - программирование
Подтвердить что ты не робот

Есть ли функция R, чтобы избежать строки для символов регулярных выражений

Я хочу создать выражение регулярного выражения, заменяя некоторые строки на поиск, и поэтому эта строка должна быть экранирована, прежде чем я могу поместить их в регулярное выражение, так что если искомая строка содержит символы регулярных выражений, она все еще работает.

Некоторые языки имеют функции, которые сделают это для вас (например, python re.escape: qaru.site/info/376522/...). Имеет ли R такую ​​функцию?

Например (созданная функция):

x = "foo[bar]"
y = escape(x) # y should now be "foo\\[bar\\]"
4b9b3361

Ответ 1

Я написал R-версию Perl quotemeta:

library(stringr)
quotemeta <- function(string) {
  str_replace_all(string, "(\\W)", "\\\\\\1")
}

Я всегда использую perl-аромат регулярных выражений, поэтому это работает для меня. Я не знаю, работает ли это для "нормальных" регулярных выражений в R.

Изменить: я нашел источник, объясняющий, почему это работает. Это в Раздел метасимволов страницы man perlre:

Это когда-то использовалось в общей идиоме, чтобы отключить или указать специальные значения метасимволов регулярного выражения в строке, которую вы хотите использовать для шаблона. Просто укажите все символы без слова:

$pattern =~ s/(\W)/\\$1/g;

Как вы можете видеть, приведенный выше R-код является прямым переводом этой же подстановки (после поездки через черту с обратной косой чертой). В manpage также говорится (внимание мое):

В отличие от некоторых других языков регулярных выражений, нет обратных символов, которые не являются буквенно-цифровыми.

что подтверждает мою точку зрения, что это решение гарантируется только для PCRE.

Ответ 2

По-видимому, в пакете Hmisc есть функция, называемая escapeRegex. Сама функция имеет следующее определение для входного значения 'string':

gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", string)

Мой предыдущий ответ:

Я не уверен, есть ли встроенная функция, но вы можете заставить ее делать то, что вы хотите. Это просто создает вектор значений, которые вы хотите заменить, и вектор того, что вы хотите заменить, а затем перебираете те, которые делают необходимые замены.

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
}

Некоторые выходные данные

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