web-dev-qa-db-fra.com

R: Trouver le dernier point d'une chaîne

Dans R, existe-t-il un moyen meilleur/plus simple que le suivant de trouver l'emplacement du dernier point d'une chaîne?

x <- "hello.world.123.456"
g <- gregexpr(".", x, fixed=TRUE)
loc <- g[[1]]
loc[length(loc)]  # returns 16

Cela trouve tous les points dans la chaîne, puis renvoie le dernier, mais cela semble plutôt maladroit. J'ai essayé d'utiliser des expressions régulières, mais je ne suis pas allé très loin.

44
Hong Ooi

Est-ce que ça marche pour toi?

x <- "hello.world.123.456"
g <- regexpr("\\.[^\\.]*$", x)
g
  • \. correspond à un point
  • [^\.] correspond à tout sauf un point
  • * spécifie que l'expression précédente (tout sauf un point) peut se produire entre 0 et un nombre illimité de fois
  • $ marque la fin de la chaîne.

Tout prendre ensemble: trouvez un point suivi de tout sauf d'un point jusqu'à la fin de la chaîne. R nécessite \ à échapper, donc \\ dans l'expression ci-dessus. Voir regex101.com pour expérimenter avec regex.

65
Vincent

Que diriez-vous d'une amélioration mineure de la syntaxe?

Cela fonctionnera pour votre exemple littéral où le vecteur d'entrée est de longueur 1. Utilisez des échappements pour obtenir un littéral "." recherchez et inversez le résultat pour obtenir le dernier index comme "premier":

 rev(gregexpr("\\.", x)[[1]])[1]

Une version vectorisée plus appropriée (dans le cas où x est supérieur à 1):

 sapply(gregexpr("\\.", x), function(x) rev(x)[1])

et une autre option plus ordonnée pour utiliser la queue à la place:

sapply(gregexpr("\\.", x), tail, 1)
29
mdsumner

Quelqu'un a posté la réponse suivante que j'ai vraiment aimée, mais je remarque qu'ils l'ont supprimée:

regexpr("\\.[^\\.]*$", x)

Je l'aime parce qu'il produit directement l'emplacement souhaité, sans avoir à chercher dans les résultats. L'expression régulière est également assez propre, ce qui est un peu une exception en ce qui concerne les expressions régulières :)

6
Hong Ooi