2017-02-22 20 views
6

Я пытаюсь получить количество открытых скобок в строке символов в R. Я использую функцию str_count из stringr пакетаподсчитать количество вхождений «(» в строке

s<- "(hi),(bye),(hi)" 
str_count(s,"(") 

Ошибка в stri_count_regex (строка, шаблон, opts_regex = атр (рисунок, :. `Некорректно вложенные скобки в регулярных выражениях шаблона (U_REGEX_MISMATCHED_PAREN)

Я надеюсь получить 3 для этот пример

+0

денешься 'str_count (с, "\\ (")' – Sotos

ответ

5

( - особый символ. Вы должны избежать этого:

> str_count(s,"\\(") 
[1] 3 

Кроме того, учитывая, что вы используете stringr, вы можете использовать функцию coll:

str_count(s,coll("(")) 
[1] 3 
2

Если вы хотите сделать это в базе R можно разделить на вектор отдельных символов и подсчитывают "(" непосредственно (без представления его в виде регулярного выражения):

> s<- "(hi),(bye),(hi)" 
> chars <- unlist(strsplit(s,"")) 
> length(chars[chars == "("]) 
[1] 3 
+2

или этот 'nchar (s) - nchar (gsub ('\\ (', '', s))' для базы R – Sotos

+0

@Sotos Это тоже работает. –

2

Вы также можете использовать gregexpr вместе с length в базе R:

sum(gregexpr("(", s, fixed=TRUE)[[1]] > 0) 
[1] 3 

gregexpr принимает вектор символов и возвращает список со стартовыми позициями каждого матча. Я добавил fixed = TRUE, чтобы соответствовать литералам. length не будет работать, потому что gregexpr возвращает -1, если подвыражение не найдено.


Если у вас есть символьный вектор длины больше, чем один, вам нужно будет кормить результат 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 

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

  • Нет связанных вопросов^_^