2013-11-26 1 views
1

Рассмотрим следующую строку:Matching вся строка в R

string = "I have #1 file and #11 folders" 

Я хотел бы заменить шаблон #1 со словом one, но я не хочу, чтобы изменить й #11. Результат должен быть:

string = "I have one file and #11 folders" 

Я попытался:

string = gsub("#1", "one, string, fixed = TRUE) 

, но это заменяет как # 1 и # 11. Я также пробовал:

string = gsub("^#1$", "one, string, fixed = TRUE) 

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

Пожалуйста, обратите внимание, что если начальная строка выглядела так:

string = "I have #1 file blah blah blah and #11 folders" 

Я хотел бы, чтобы результат:

string = "I have 1 file blah blah blah and #11 folders" 

Другими словами, я буквально просто хочу, чтобы изменить точную картину #1 не касаясь остальной части строки. Это возможно?

ответ

3

Если вы используете perl=TRUE аргумент инструменты, такие как gsub, тогда будет использоваться движок relx perl, который может помочь.

Образец «# 1 \\ b» будет соответствовать # 1, за которым следует граница слова, поэтому он будет соответствовать # 1, но не # 11 (так как между двумя 1 нет границы). Есть также инструменты для позитивного и негативного взгляда, которые ищут вещи, следующие за вашим шаблоном (например, файл слов), но не включают их в подлежащую замене часть.

+0

Это похоже на использование класса '[: alpha:]' в аргументе 'pattern', без' perl = TRUE', да? – TheComeOnMan

+0

@Codoremifa, '\ w' похоже на' [: alpha:] ', но то, что я имел в виду (и теперь исправлено), является' \ b' (для того, чтобы избежать другого, требуется дополнительная '\'), которая соответствует ничего между символом «слова» и «неслововым» характером, в этом случае ничего между «1» и «» будет соответствовать, но не одно между «1» и «1». –

1

Используйте пробел после # 1 в свою пользу:

gsub("#1 ", "one ", string, fixed = TRUE) 

[1] "I have one file and #11 folders" 
+0

Это не удастся для фразы «У меня есть файл №1 и №1». – Justin

+0

Я должен был указать в своем сообщении, что это очень упрощенный пример. В действительности, я сопоставляю шаблон в файле, где я не знаю, сколько пробелов предшествует или приходит после шаблона. Поэтому это решение на самом деле не работает для меня. – Mayou

+0

Джастин не будет ...? @Mariam - это решение работает для всех ваших примеров. – eddi

4

Я не уверен, если я понял правильно, но делает эту помощь -

a <- "I have #1 file and #11 folders" 
b <- "I have #1file and #11 folders" 
c <- "I have #1,file and #11 folders" 

> gsub(x = a, pattern = "#1.*file", replacement = "one file") 
[1] "I have one file and #11 folders" 
> gsub(x = b, pattern = "#1.*file", replacement = "one file") 
[1] "I have one file and #11 folders" 
> gsub(x = c, pattern = "#1.*file", replacement = "one file") 
[1] "I have one file and #11 folders" 
+0

Не могли бы вы объяснить роль. *? Спасибо – Mayou

+0

'. *' Говорит, что ищет любое количество символов между «# 1» и «file». Этот grep изменит строку: «У меня есть файл 1 blah blah blah», а также «У меня есть один файл». – TheComeOnMan

+0

О, я сейчас понимаю. Итак, что, если я не знаю, что такое слово, которое появляется после «# 1» (т. Е. Я не знаю, является ли это слово «файл» или что-то еще)? Есть ли способ обобщить это? А также, если строка была «У меня есть файл 1 blah blah», я хотел бы сохранить blah blah – Mayou