Простой способ найти и заменить динамические значения ({{пример}}) с помощью регулярного выражения в R

#regex #r

#регулярное выражение #r

Вопрос:

У меня есть некоторые динамические значения, полученные из json формата {{example_value}} . У меня есть некоторый R-код, который вычисляет фактическое значение. Однако единственное решение, которое я нашел для замены заполнителя фактическим значением, очень длинное и уродливое.

У кого-нибудь есть какие-нибудь аккуратные решения?

Пример замены {{example_value}} на 5.5 :

 > gsub( gsub("\}","\\}",gsub("\{","\\{","{{example_value}}")), 
5.5, "{{example_value}}")

[1] "5.5"
 

Еще один пример, который объясняет, почему я написал вложенный gsub:

 dictionary = "{{example_value}}"
> gsub( gsub("\}","\\}",gsub("\{","\\{",dictionary)), 
5.5, "{{example_value}}")

[1] "5.5"
 

Обычно dictionary это список, содержащий все динамические значения, которые я ожидаю заменить.

Ответ №1:

Вы можете использовать это:

 gsub("{{example_value}}", "5.5", subject, perl=TRUE);
 

Комментарии:

1. Спасибо, Алекс! Увидимся в следующий раз. 🙂

2. Эй, Алекс, я вижу, идет какая-то дискуссия… в случае, если вам нужны полные вложенные фигурные скобки вместо литерала, я бы использовал это рекурсивное выражение: {{(?:[^{}] |(?R))*}}

3. Мне нужен литерал, потому что я читаю фигурные скобки из словаря.

4. Да, именно так я это понял, я просто предложил это, потому что заметил, что в комментариях был какой-то конвоир. 🙂

Ответ №2:

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

 a<-"The total is {{example}} dollars less"
m <- regexpr("{{([^}] )}}", a, perl=T)
regmatches(a, m)
# [1] "{{example}}"
 

А затем regmatches имеет приятную функцию, с помощью которой вы можете легко заменять совпадения

 regmatches(a, m) <- 5.5
a
# [1] "The total is 5.5 less"
 

Что является своего рода изящным трюком.

Комментарии:

1. @MrFlick или это, {{(?:[^{}] |(?R))*}} чтобы соответствовать таким вещам, как {{ my {{beautiful}} {{nest {{ :) }} }} }} … Но из требований не похоже, что это то, чего он хочет.

Ответ №3:

РЕДАКТИРОВАТЬ: Возможно, это может привести вас к тому, что вы ищете.

 re  <- c('{{foo}}', '{{bar}}')
val <- c('5.5',  '1.1')

recurse <- function(pattern, repl, x) {
    for (i in 1:length(pattern))
       x <- gsub(pattern[i], repl[i], x, perl=T)
       x
}

x <- 'I have {{foo}} and {{bar}}'
recurse(re, val, x)

# [1] "I have 5.5 and 1.1"
 

Комментарии:

1. Привет, хотя это правильное решение не подходит для поиска и замены динамических значений на основе словаря существующих динамических значений.

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

3. Как это соответствует только одному набору фигурных скобок?

4. Такое поведение нежелательно: > gsub('{{[^}]*}}', '5.5', "{{hmm}} and {{hello}}", perl=T) выдает [1] "5.5 and 5.5 .

5. Это то, что я буду делать, и использовать lapply в from векторе! 🙂 Спасибо!