2013-11-25 1 views
1

Я пытаюсь выполнить замену gsub в R. Я хотел бы определить два термина из двух списков, разделенных одним пробелом, и заменить его символом подчеркивания. Я успешно определил совпадение, но я недостаточно опытен в regex, чтобы понять документацию gsub. Может кто-нибудь помочь написать gsub?Замена regex Gsub

Прямо сейчас у меня есть:

gsub("(a|b|c)\\s+(x|y|z)","(a|b|c)_(x|y|z)",a x) 

(Примечание: Есть несколько мест в строке, которые соответствуют этим, если это имеет значение)

Я хочу, чтобы перейти от:
топора -> A_x
bz -> b_z
привет мир bx, как вы az вы -> привет мир b_x как a_z вы ... и так далее.

Вместо этого он делает:
топор -> (а | б | в) (х | у | г)
BZ -> (а | б | в)
(х | у | г) .. . и так далее.

Если кто-то хочет отбросить небольшую теорию, это будет оценено, но я работаю над крайним сроком, поэтому одновременный ответ был бы идеальным.

Спасибо.

+0

Возможно, вам потребовалось больше времени, чтобы написать этот вопрос, чем потребовалось бы, чтобы найти ответ самостоятельно через документ 'gsub'. У него даже есть примеры, которые используют '\\ 1',' \\ 2' и т. Д. – flodel

ответ

2

Вы должны использовать \\1 и \\2, чтобы заменить термин внутри первого и второго () с собой.

vec <- "hello world b x how are a z you" 

gsub("(a|b|c)\\s+(x|y|z)","\\1_\\2", vec) 
# [1] "hello world b_x how are a_z you" 
+0

Спасибо. В документации было похоже, что «\\ 1» предназначалось для обозначения количества обратных пространств из какого-либо места. Как выполняется сегментация? Разве это просто автоматическое разделение пространства? – user3030872

+0

@ user3030872 Как уже упоминалось в ответе, '\\ 1' - это строка в первом'() '. –