J'ai beaucoup de chaînes comme celle-ci:
556662
Je veux extraire la sous-chaîne qui se trouve juste après le dernier "/" et se termine par "_" :
2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0
J'ai découvert comment extraire: / 01/01/07/556662 p >
en utilisant l'expression rationnelle suivante: (\/)(.*?)(?=\_)
Veuillez indiquer comment capturer le bon groupe.
3 Réponses :
Vous pouvez utiliser un groupe de capture:
library(stringr)
str = c("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0")
str_match(str, "/([^_/]+)_[^/\\s]*")[,2]
# [1] "556662"
Explication
/ Correspondre littéralement ([^ _ /] +) Capturer dans un groupe ne correspondant pas à un trait de soulignement ou à une barre oblique _ [^ / \ s] * Correspond à _ , puis plus de 0 fois sans barre oblique ni espace blanc Une option pour obtenir le groupe de capture pourrait être d'obtenir la deuxième colonne en utilisant str_match:
/([^_/]+)_[^/\s]*
Ce n'est pas ce dont j'ai besoin, je veux extraire tout ce qui se trouve entre le dernier / et l'avant _
@SteveS C'est dans le premier groupe de capture. J'ai mis à jour ma réponse.
mais je n'ai besoin de rien après la sous-chaîne qui se situe entre last / et before _.
Comment puis-je extraire la seule partie dont j'ai besoin.
Vous pouvez utiliser
stri_extract_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", "(?<=/)[^_/]+")
## => [1] "556662"
Ici, l'expression régulière correspond et affiche la première sous-chaîne qui correspond à
. * / - 0 ou plus de caractères autant que possible jusqu'au dernier / \ K - omet cette partie de la correspondance [^ _] + - met 1 ou plusieurs caractères autres que _ dans la valeur de correspondance. Ou, une solution sub :
library(stringi)
stri_match_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", ".*/([^_]+)")[,2]
## [1] "556662"
Voir le démo regex .
Ici, il est similaire au précédent, mais le ou plusieurs caractères autres que _ sont capturés dans le groupe 1 ( \ 1 dans le modèle de remplacement) et le final. * assurez-vous que toute l'entrée correspond ( et consommé, prêt à être remplacé).
Solutions R alternatives non basiques
Si vous pouvez vous permettre ou préférez travailler avec stringi , vous pouvez utiliser
sub(".*/([^_]+).*", "\\1", x)
Cela correspondra à une chaîne jusqu'au dernier / et capturera dans le groupe 1 (auquel vous accédez dans Colonne 2 en utilisant [ 2] ) 1 ou plusieurs caractères autres que _.
Ou
x <- "2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0"
regmatches(x, regexpr(".*/\\K[^_]+", x, perl=TRUE))
## [1] "556662"
Cela extraira la dernière correspondance d'une chaîne qui se compose d'un ou plusieurs caractères autres que _ et / après un / .
/ p>
Solution professionnelle brillante facile et directe! Merci Wiktor !!! @ wiktor-stribizew
@SteveS J'ai également ajouté des solutions regex R non basiques.
J'ai changé les règles Regex selon le code de Wiktor Stribiżew.
x <- "2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0"
regmatches(x, regexpr(".*/([0-9]+)", x, perl=TRUE))
sub(".*/([0-9]+).*", "\\1", x)
[1] "2019/01/01/07/556662"
[1] "556662"
Notez que OP ne mentionne pas dans l'article qu'après le dernier / et avant le prochain _ , il ne devrait y avoir que des chiffres.