Есть ли функция R, чтобы избежать строки для символов регулярных выражений
Я хочу создать выражение регулярного выражения, заменяя некоторые строки на поиск, и поэтому эта строка должна быть экранирована, прежде чем я могу поместить их в регулярное выражение, так что если искомая строка содержит символы регулярных выражений, она все еще работает.
Некоторые языки имеют функции, которые сделают это для вас (например, python re.escape
: qaru.site/info/376522/...). Имеет ли R такую функцию?
Например (созданная функция):
x = "foo[bar]"
y = escape(x) # y should now be "foo\\[bar\\]"
Ответы
Ответ 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\\]"