2017-02-01 2 views
0

У меня есть много нечистых данных в виде:R - замена строк с использованием GSUB()

abc 
abc/def 
abc/de 
abc/d 
abc/def/i j k 
abc/def/i 
abc/def/i j 

Это только часть данных, я хотел бы изменить. Это часть гораздо большего набора данных.

Я хочу изменить все элементы на abc/def/i j k. Я использовал функцию gsub() следующим образом:

gsub('abc[a-z/]', 'abc/def/i j k', str) 

выход:

abc/def/i j k 
abc/def/i j k/def 
abc/def/i j k/de 
abc/def/i j k/d 

Проблема в том, что он заменяет любое вхождение шаблона.

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

gsub('abc$|abc/d$|abc/de$|abc/def/i$', 'abc/def/i j k', str) 

Однако, это не будет работать, если есть изменение каких-либо новых данных. Так что мне было интересно, удалось ли получить результат без жесткого кодирования параметров.

+0

So символы, которые 'abc' /' def' заполнители? В противном случае '^ abc [a-z /] * $' будет работать с 'sub'. –

+1

Если я правильно понимаю, вы хотите, чтобы все элементы стали «abc/def», так почему бы вам просто не использовать 'rep (« abc/def », length (str))'? –

+0

Попробуйте 'sub (" (abc) [/ az] * "," \\ 1/def ", x)' или 'sub ("^(abc) [/ az] * $ "," \\ 1/def ", x)' –

ответ

2

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

x <- c("abc", "abc/def","abc/de","abc/d","abc/def/i j k","abc/def/i","abc/def/i j") 
sub("^(abc)(?:/[^/]*)?", "\\1/def", x) 
## => [1] "abc/def"  "abc/def"  "abc/def"  "abc/def"  
## [5] "abc/def/i j k" "abc/def/i"  "abc/def/i j" 

См R demo

Детали:

  • ^ - начало строки
  • (abc) - Группа 1: abc
  • (?:/[^/]*)? - дополнительная группа соответствие последовательность:
    • / - это /
    • [^/]* - 0+ кроме /
+1

Я снова проверил. Это сработало. Благодарю. –

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