Ответ 1
(
это специальный символ. Вы должны избежать его:
str_count(s,"\\(")
# [1] 3
В качестве альтернативы, если вы используете stringr
, вы можете использовать функцию coll
:
str_count(s,coll("("))
# [1] 3
Я пытаюсь получить количество открытых скобок в символьной строке в R. Я использую функцию str_count
из пакета stringr
s<- "(hi),(bye),(hi)"
str_count(s,"(")
Ошибка в stri_count_regex (string, pattern, opts_regex = attr (pattern,: 'Неверно вложенные круглые скобки в шаблоне regexp. (U_REGEX_MISMATCHED_PAREN)
Я надеюсь получить 3 для этого примера
(
это специальный символ. Вы должны избежать его:
str_count(s,"\\(")
# [1] 3
В качестве альтернативы, если вы используете stringr
, вы можете использовать функцию coll
:
str_count(s,coll("("))
# [1] 3
Если вы хотите сделать это в базе R, вы можете разбить на вектор отдельных символов и считать "("
напрямую (не представляя его как регулярное выражение):
> s<- "(hi),(bye),(hi)"
> chars <- unlist(strsplit(s,""))
> length(chars[chars == "("])
[1] 3
Вы также можете использовать gregexpr
вместе с length
в базе R:
sum(gregexpr("(", s, fixed=TRUE)[[1]] > 0)
[1] 3
gregexpr
принимает символ символа и возвращает список с начальными позициями каждого совпадения. Я добавил fixed = TRUE, чтобы соответствовать литералам. length
не будет работать, потому что gregexpr
возвращает -1, когда подвыражение не найдено.
Если у вас есть вектор символов длиной больше единицы, вам нужно будет sapply
результат на sapply
:
# new example
s<- c("(hi),(bye),(hi)", "this (that) other", "what")
sapply((gregexpr("(", s, fixed=TRUE)), function(i) sum(i > 0))
[1] 3 1 0