Регулярное выражение, проанализированное с заменой grepl

Цель состоит в том, чтобы проанализировать регулярное выражение и заменить соответствующий шаблон.

Рассмотрим этот пример:

data <- c("cat 6kg","cat g250", "cat dog","cat 10 kg") 

Мне нужно найти все вхождения cat и числа [0-9]. Сделать это:

found <- data[grepl("(^cat.[a-z][0-9])|(^cat.[0-9])",data)]
found
[1] "cat 6kg"   "cat g250"  "cat 10 kg"

Следующим шагом будет замена каждого элемента found строкой cat. Я попытался использовать gsub, sub и gsubfn() из пакета (gsubfn) в соответствии с вопросом Stack 20219311:

gsubfn("((^cat.[a-z][0-9])|(^cat.[0-9]))", "cat",data)
[1] "catkg"   "cat50"   "cat dog" "cat0 kg"

который НЕ является ожидаемым результатом:

[#] "cat" "cat" "cat dog" "cat"

Я думаю, что упускаю момент. Я был бы признателен за любую помощь, которую я мог бы получить. Спасибо.


person remi    schedule 25.07.2015    source источник


Ответы (3)


Просто,,,, Просто назначьте строку cat элементам соответствия. Это заменит все символы, присутствующие в элементе, на cat

> data <- c("cat 6kg","cat g250", "cat dog","cat 10 kg") 
> data[grepl("(^cat.[a-z][0-9])|(^cat.[0-9])",data)] <- "cat"
> data
[1] "cat"     "cat"     "cat dog" "cat" 

or

> data <- c("cat 6kg","cat g250", "cat dog","cat 10 kg") 
> data[grepl("^cat.[a-z]?[0-9]",data)] <- "cat"
> data
[1] "cat"     "cat"     "cat dog" "cat" 
person Avinash Raj    schedule 25.07.2015
comment
Спасибо Авинаш. Просто любопытно, почему не работает gsub? Кроме того, как автоматизировать замену любой строки str (т.е. cat). Должен ли я использовать paste()... - person remi; 25.07.2015
comment
@remi gsubfn просто заменяет все совпадающие символы на cat, поэтому оставляет несопоставленные символы. попробуй gsub("^cat.[a-z]?[0-9].*", "cat", x) . Это будет соответствовать всем оставшимся символам, потому что мы добавили .* последним. - person Avinash Raj; 25.07.2015

Вы также можете сделать

 sub('\\s*dog(*SKIP)(*F)|(?<=cat).*', '', data, perl=TRUE)
 #[1] "cat"     "cat"     "cat dog" "cat"    

Or

 sub('(cat)\\s*([0-9]|[a-z][0-9]).*$', '\\1', data)
 #[1] "cat"     "cat"     "cat dog" "cat"    
person akrun    schedule 25.07.2015

Попробуй это:

gsub('(\\w?[0-9].*)','',data)
#[1] "cat "    "cat "    "cat dog" "cat " 
person Shenglin Chen    schedule 25.07.2015