web-dev-qa-db-fra.com

compter le nombre d'occurrences de "(" dans une chaîne

J'essaie d'obtenir le nombre de crochets ouverts dans une chaîne de caractères dans R. J'utilise le str_count fonction du package stringr

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

Erreur dans stri_count_regex (chaîne, modèle, opts_regex = attr (modèle,: `Parenthèses incorrectement imbriquées dans le modèle d'expression régulière. (U_REGEX_MISMATCHED_PAREN)

J'espère en avoir 3 pour cet exemple

14
NPHARD

( est un caractère spécial. Vous devez y échapper:

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

Alternativement, étant donné que vous utilisez stringr, vous pouvez utiliser la fonction coll:

str_count(s,coll("("))
# [1] 3
10
sebastian-c

Vous pouvez également utiliser gregexpr avec length dans la base R:

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

gregexpr prend un vecteur de caractères et retourne une liste avec les positions de départ de chaque correspondance. J'ai ajouté fixed = TRUE afin de faire correspondre les littéraux .length ne fonctionnera pas car gregexpr renvoie -1 lorsqu'une sous-expression n'est pas trouvée.


Si vous avez un vecteur de caractères de longueur supérieure à un, vous devez fournir le résultat à 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
3
lmo

Si vous voulez le faire en base R, vous pouvez vous diviser en un vecteur de caractères individuels et compter le "(" directement (sans le représenter comme une expression régulière):

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