13 votes

Comment extraire les derniers chiffres d'une chaîne de caractères à l'aide d'expressions régulières ?

J'ai un tas de noms de colonnes

L_1_3
L_2_23
L_3_91
L_3_16

Je veux remplacer ces noms de colonnes par de nouveaux noms en utilisant les derniers chiffres suivant le _ comme ceci :

3
23
91
16

J'ai essayé colnames(X) <- gsub("L_\\d\\d_", "", colnames(X)) qui fonctionne pour les chaînes de caractères avec des chiffres doubles à la fin. J'en veux un qui fonctionne à la fois pour les chiffres simples et les chiffres doubles.

Gracias.

12voto

Ian Campbell Points 19700

Voici une option avec une anticipation positive :

gsub(".+_(?=\\d+$)", "", X, perl = TRUE)
[1] "3"  "23" "91" "16"

5voto

The fourth bird Points 40138

Si c'est le modèle qui fonctionne pour vous pour 2 chiffres, la seule chose à faire est de rendre l'un des chiffres facultatif en utilisant la fonction ?

L_\\d\\d?_

Démonstration de Regex | R démo


Si vous devez faire correspondre l'ensemble du motif, vous pouvez utiliser un groupe de capture et utiliser des ancres pour affirmer le début du motif. ^ et la fin $ de la chaîne et utiliser le groupe dans le remplacement.

^L_\\d\\d?_(\\d+)$

En pièces détachées

^      Start of string
L\_     Match L\_
\\d     Match a digit
\\d?    Match a digit and repeat 0 or 1 times
\_      Match \_
(      Capture group 1
  \\d+  Match a digit and repeat 1 or more times
)      Close group
$      End of string

Démonstration de Regex | R démo

X <- c("L_1_3", "L_2_23", "L_3_91", "L_3_16")
gsub("^L_\\d\\d?_(\\d+)$", "\\1", X)

Sortie

[1] "3"  "23" "91" "16"

4voto

Rui Barradas Points 21005

Voici une expression régulière qui le fait.
Il obtient n'importe quoi jusqu'à un non-chiffre suivi du groupe de capture d'un ou plusieurs chiffres à la fin. Et remplace par le groupe de capture.

sub('.*[^[:digit:]]{1}([[:digit:]]+$)', '\\1', x)
#[1] "3"  "23" "91" "16"

Une regex qui fonctionne pour les chiffres simples et doubles, mais ni plus ni moins, serait la suivante

sub('.*[^[:digit:]]{1}([[:digit:]]{1,2}$)', '\\1', x)
#[1] "3"  "23" "91" "16"

Données

x <- scan(what = character(), text = '
L_1_3
L_2_23
L_3_91
L_3_16')

4voto

akrun Points 148302

Nous pouvons utiliser str_extract

library(stringr)
str_extract(X, "\\d+$")
#[1] "3"  "23" "91" "16"

données

X <- c("L_1_3", "L_2_23", "L_3_91", "L_3_16")

2voto

Daniel O Points 4143

J'ai essayé de le garder aussi simple que possible

sub(".*_(\\d+$)", "\\1", X)
[1] "3"  "23" "91" "16"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X