3
votes

extraction d'une partie du chemin à l'aide de sous

J'essaye d'extraire un nom de fichier d'un chemin dans r. Dans une chaîne comme

1255144514755144

Je veux extraire 125514_45147_55144

J'utilise l'expression suivante:

 sub(".*vp/(.*?)/.*", "\\1", input) 

ce qui fonctionne mais cela supprime également les traits de soulignement:

someurl.com/vp/125514_45147_55144.jpg?_nc25244

Je ne parviens pas à comprendre comment conserver les traits de soulignement


1 commentaires

Êtes-vous sûr que c'est le résultat que vous obtenez? Cela ne semble pas correspondre à ce que vous avez publié. Ici, votre sous recherche un / après le numéro qui ne correspond pas à votre entrée d'échantillon.


4 Réponses :


2
votes

Je suggère de le corriger en tant que

x <- "someurl.com/vp/125514_45147_55144.jpg?_nc25244"
regmatches(x,regexec("/vp/([^/?]*)\\.",x))[[1]][2]
## => [1] "125514_45147_55144"

Voir la démo regex

Détails

  • . * - 0 ou plus de caractères autant que possible
  • / vp / - une sous-chaîne littérale
  • ([^ /?] *?) - Groupe 1 (sa valeur capturée est référencée par \ 1 à partir du modèle de remplacement): 0 caractère ou plus autre que / et ? , aussi peu que possible
  • \\. - un point
  • [^ / ?.] * - 0+ caractères autres que . , ? et /
  • (?: \\?. *)? - une sous-chaîne facultative correspondant à ? , puis n'importe quel 0+ caractères autant que possible
  • $ - fin de chaîne.

Avec les regmatches / regexec le modèle devient beaucoup plus clair:

sub(".*/vp/([^/?]*?)\\.[^/?.]*(?:\\?.*)?$", "\\1", input)

Voir le Démo R


0 commentaires

2
votes

stringr alternative

library( stringr )
str_match( "someurl.com/vp/125514_45147_55144.jpg?_nc25244", "^.*/(.*?)\\..*$" )[[2]]
#[1] "125514_45147_55144"


0 commentaires

5
votes

Supprimez le point et tout ce qui suit du nom de base:

sub("(.*)\\..*", "\\1", basename(x))
## [1] "125514_45147_55144"

S'il est possible qu'il y ait des points dans le nom de fichier, utilisez ce modèle légèrement plus complexe:

sub("\\..*", "", basename(x))
## [1] "125514_45147_55144"


0 commentaires

2
votes

Inspiré de la réponse de @ G.Grothendieck, une solution sans regex utilisant dirname , basename et chartr

x = 'someurl.com/vp/125514_45147_55144.jpg?_nc25244'
dirname(chartr(x = basename(x), ".", "/"))
# [1] "125514_45147_55144"


0 commentaires