Удалить круглые скобки из символьной строки

Я пытаюсь удалить скобку из строки в R и сталкиваюсь со следующей ошибкой:

string <- "log(M)"
gsub("log", "", string) # Works just fine
gsub("log(", "", string) #breaks
# Error in gsub("log(", "", test) : 
#   invalid regular expression 'log(', reason 'Missing ')''

person mike    schedule 26.02.2012    source источник


Ответы (3)


Удалите скобки с помощью двойной обратной косой черты:

gsub("log\\(", "", string)

(Обязательно: http://xkcd.com/234/)

person Ben Bolker    schedule 26.02.2012

Ответ Бена дает вам хороший обычно применимый способ сделать это.

В качестве альтернативы в вашей ситуации вы можете использовать аргумент fixed=TRUE, например:

gsub("log(", "", string, fixed=TRUE)
# [1] "M)"

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

person Josh O'Brien    schedule 26.02.2012
comment
@BenBolker - Странно. Он должен быть fixed=TRUE, но fixed="TRUE", fixed="true" и fixed="True" тоже работают. Другие комбинации, такие как fixed="TRue" или fixed="TruE", этого не делают. В связи с этим (?) Недавно я понял, что rnorm("9") (например) работает, хотя я бы сказал, что не должно. (FWIW, rnorm("9", "1") не работает.) Интересно, имеют ли эти случаи какое-то отношение к тому, как базовый C-код обрабатывает аргументы, которые ему передаются. Что вы думаете? - person Josh O'Brien; 13.10.2014
comment
Интересно. Ответ находится в ?as.logical: ‘as.logical’ attempts to coerce its argument to be of logical type. For ‘factor’s, this uses the ‘levels’ (labels). Like ‘as.vector’ it strips attributes including names. Character strings ‘c("T", "TRUE", "True", "true")’ are regarded as true, ‘c("F", "FALSE", "False", "false")’ as false, and all others as ‘NA’. - person Ben Bolker; 13.10.2014
comment
@BenBolker Хорошая находка. Интересно, происходит ли какое-то связанное / аналогичное преобразование в случае rnorm("9") и происходит ли оно только для этого первого аргумента, потому что это аргумент без значения по умолчанию. Только что проверил seq_len("9") (как первая .Primitive функция, которая пришла в голову), и она показывает аналогичное поведение ... - person Josh O'Brien; 13.10.2014

Если вы не являетесь специалистом по регулярным выражениям (многие из нас таковыми не являются!), Я считаю более простым разделить удаление ненужного текста и скобок, если ваш запрос поддерживает это.

Вопрос, похоже, указывает только на то, что вы хотите удалить скобки, поэтому вы можете использовать:

gsub(paste(c("[(]", "[)]"), collapse = "|"), "", string)

В результате получается строка без скобок: logM

Если вы также хотите удалить M

gsub(paste(c("M", "[(]", "[)]"), collapse = "|"), "", string)

Это приводит к журналу результатов

person glenn_in_boston    schedule 18.06.2021