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
4 Réponses :
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
stringr alternative
library( stringr ) str_match( "someurl.com/vp/125514_45147_55144.jpg?_nc25244", "^.*/(.*?)\\..*$" )[[2]] #[1] "125514_45147_55144"
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"
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"
Ê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
sousrecherche un/après le numéro qui ne correspond pas à votre entrée d'échantillon.