2
votes

R Groupe de capture Regex?

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.


0 commentaires

3 Réponses :


3
votes

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

Démo Regex | Démo R

Une option pour obtenir le groupe de capture pourrait être d'obtenir la deuxième colonne en utilisant str_match:

/([^_/]+)_[^/\s]*


4 commentaires

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.



4
votes

Vous pouvez utiliser

stri_extract_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", "(?<=/)[^_/]+")
## => [1] "556662"

Voir la regex et Démo R .

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>


2 commentaires

Solution professionnelle brillante facile et directe! Merci Wiktor !!! @ wiktor-stribizew


@SteveS J'ai également ajouté des solutions regex R non basiques.



0
votes

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)

Sortie

[1] "2019/01/01/07/556662"

[1] "556662"

R démo h2 >


1 commentaires

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.