2014-10-02 2 views
4

Есть ли регулярное выражение для сохранения рисунка шкафа в вену \U и \L?regex для сохранения картины случая, заглавная буква

В приведенном ниже примере, я хочу, чтобы преобразовать "date" в "month" при сохранении капитализации используется в input

from  to 
    "date" ~~> "month" 
    "Date" ~~> "Month" 
    "DATE" ~~> "MONTH" 

В настоящее время я использую три вложенных вызовов в sub для достижения этой цели.

input <- c("date", "Date", "DATE") 
expected.out <- c("month", "Month", "MONTH") 

sub("date", "month", 
    sub("Date", "Month", 
    sub("DATE", "MONTH", input) 
) 
) 

Цель состоит в том, чтобы иметь один pattern и один replace, такие как

gsub("(date)", "\\Umonth", input, perl=TRUE) 

, который даст желаемый результат

+1

Почему бы просто не использовать карту через именованный вектор: 'карта <- setNames (expected.output, вход) '. Затем выполните 'month <- map [date]'. – flodel

+0

@flodel - умное мышление - здесь нет необходимости в каком-либо регулярном выражении. – thelatemail

+1

@flodel - Я подозреваю, что Рикардо тоже хочет решения, которое будет работать на входы типа 'input <-" Вот дата, дата и дата " –

ответ

6

Это один из тех случаев, когда я думаю for цикл обоснованно:

input <- rep("Here are a date, a Date, and a DATE",2) 
pat <- c("date", "Date", "DATE") 
ret <- c("month", "Month", "MONTH") 

for(i in seq_along(pat)) { input <- gsub(pat[i],ret[i],input) } 
input 
#[1] "Here are a month, a Month, and a MONTH" 
#[2] "Here are a month, a Month, and a MONTH" 

И альтернатива любезность @flodel осуществляет ту же логику, что и Переберите Reduce:

Reduce(function(str, args) gsub(args[1], args[2], str), 
     Map(c, pat, ret), init = input) 

Для некоторых бенчмаркинга этих параметров см @ ответ TylerRinker в.

5

Используя пакет gsubfn, вы можете избежать использования вложенных вспомогательных функций и сделать это за один вызов.

> library(gsubfn) 
> x <- 'Here we have a date, a different Date, and a DATE' 
> gsubfn('date', list('date'='month','Date'='Month','DATE'='MONTH'), x, ignore.case=T) 
# [1] "Here we have a month, a different Month, and a MONTH" 
+0

, аргумент замены вызова gsubfn() - это список из трех подстановок, которые зависят от капитализации «date». Но можете ли вы объяснить, почему это список (...) - это функция, которую R понимает как замену? Извините, если это не ясно. Может быть, вы могли бы объяснить, что делает этот звонок. Спасибо – lawyeR

+0

@lawyeR - так как 'ignore.case = TRUE' функция соответствует шаблону' date' ('date' или' Date' или 'DATE'), а затем просматривает то, что соответствовало в списке заметок (...) '. Итак, если 'Date' был сопоставлен, он захватывает список (..) [["Date"]] ', который в этом случае является' Month'. – thelatemail

4

Вот подход qdap. Довольно прямо вперед, но не самый быстрый:

input <- rep("Here are a date, a Date, and a DATE",2) 
pat <- c("date", "Date", "DATE") 
ret <- c("month", "Month", "MONTH") 


library(qdap) 
mgsub(pat, ret, input) 

## [1] "Here are a month, a Month, and a MONTH" 
## [2] "Here are a month, a Month, and a MONTH" 

Бенчмаркинг:

input <- rep("Here are a date, a Date, and a DATE",1000) 

library(microbenchmark) 

(op <- microbenchmark( 
    GSUBFN = gsubfn('date', list('date'='month','Date'='Month','DATE'='MONTH'), 
      input, ignore.case=T), 
    QDAP = mgsub(pat, ret, input), 
    REDUCE = Reduce(function(str, args) gsub(args[1], args[2], str), 
     Map(c, pat, ret), init = input), 
    FOR = function() { 
     for(i in seq_along(pat)) { 
      input <- gsub(pat[i],ret[i],input) 
     } 
     input 
    }, 

times=100L)) 

## Unit: milliseconds 
## expr  min   lq  median   uq  max neval 
## GSUBFN 682.549812 815.908385 847.361883 925.385557 1186.66743 100 
## QDAP 10.499195 12.217805 13.059149 13.912157 25.77868 100 
## REDUCE 4.267602 5.184986 5.482151 5.679251 28.57819 100 
##  FOR 4.244743 5.148132 5.434801 5.870518 10.28833 100 

enter image description here

+1

Я хочу выбрать это как ответ, просто для тестов :) –

+0

Подход 'qdap' медленнее, потому что он делает некоторое переупорядочение шаблонов, чтобы убедиться, что все больше/больше n символьных подмножеств/замен на первом месте, чтобы быть менее вероятным, чтобы они сначала будут заменены более мелкими заменами. Если это не имеет смысла, просто осознайте, что есть встроенные средства защиты. –

Смежные вопросы