2015-07-25 8 views
0

Целью является синтаксический анализ регулярного выражения и замена совпадающего шаблона.Регулярное выражение, обработанное заменой 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, суб и 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" 

I Думаю, мне не хватает смысла. Буду признателен за любую помощь, которую я мог бы получить. Благодарю.

ответ

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" 

или

> 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" 
+0

С уважением, Avinash. Просто любопытно, почему не работал gsub? Кроме того, как автоматизировать замену любой строки 'str' (т. Е.' Cat'). Должен ли я использовать paste() ... – remi

+0

@remi gsubfn просто заменяет все совпадающие символы символом 'cat', поэтому он оставляет непревзойденные символы. попробуйте 'gsub ("^cat. [a-z]? [0-9]. * "," cat ", x)'. Это будет соответствовать всем остальным символам, потому что мы добавили '. *' В последний раз. –

1

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

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

Или

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

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

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