0
votes

Ignorer la dernière "/" dans r regex

donné la chaîne "http://compras.dados.gov.br/materialis/v1/materialis.html?pdm=08275/" , j'ai besoin de générer un filtre de regex afin qu'il Ignore le dernier char si c'est un "/".

J'ai essayé la regex suivante "(http: ////)? compas \\. Dados \\. BR. * \\ ?. * (? à partir de regexr.com/4om61 , mais Il ne fonctionne pas lorsque je rencontre en r comme: xxx

J'ai besoin de cela pour travailler dans une fonction pure regex et Grep, sans utiliser de package de chaîne R. Merci.

cas simplifié: Après des contributions importantes de votre part, un dernier problème reste. Parce que je vais utiliser regex comme une entrée dans une autre frienoncée, la solution doit fonctionner avec pure regex et grep .

Le point restant est un point restant Un: Compte tenu des chaînes "A1BC /" ou "A1BC", la regex doit renvoyer "A1BC". Bâtiment sur des suggestions que j'ai reçues, j'ai essayé

grep (". * [^ //]" "," A1BC / ", Perl = t, valeur = t) , mais toujours Obtenez "A1BC /" au lieu de "A1BC". Toute astuce? Merci.


11 commentaires

Utilisez ceci comme regex: (?: Http: //)? Compas \ .dados \ .gov \ .br. * \? [^ /] * Il n'est pas nécessaire d'utiliser LookbeHind ici.


gsub ('/ $', '', x) fera une copie de x sans le / à la fin (s'il y en a un Pour l'élément donné de x )


Je ne suis pas complètement clair sur ce que vous recherchez - que voulez-vous dire par ignorer? Voulez-vous qu'il est renvoyé sans le dernier / ou voulez-vous qu'il s'agisse d'un élément optionnel de votre modèle de recherche?


Cher Andrew, je veux que la corde soit retournée sans le dernier "/". Merci


@Fabiocorrea: Avez-vous essayé ma regex suggérée?


@anubhava, oui, ça n'a pas fonctionné. Simplifier le problème et la construction de votre solution proposée, lorsque j'essaye Grep (". * [^ //]", "ABC /", Perl = t, valeur = t), je reçois "ABC /" au lieu de "ABC" au lieu de "ABC" . Merci.


Avec grep () , même si vous correspondez correctement à une partie de la chaîne, elle retournera la chaîne d'origine indépendamment. E. g., grep ("a", "abc", valeur = t)


@FABIOCORREA: Vérifiez ceci: Stackoverflow.com/a/23901600/548225


Juste grep le gsub ("/ + $", "" ", x)


J'ai édité la question initiale d'un dernier numéro simplifié, après toutes les contributions. Merci.


@Fabiocorrea, il ne peut pas fonctionner avec seulement grep () car grep () n'est pas conçu pour renvoyer des correspondances partielles. Il est conçu pour renvoyer un index - grep ("c", lettres) - mais il peut renvoyer la valeur de la chaîne d'origine au lieu de l'index - grep ("C" , lettres, valeur = t) . Je suggérerais d'utiliser une autre fonction de base telle que gsub (seul ou avec grep ). Lire l'en-tête de valeur dans ? Grep


4 Réponses :


0
votes

Si vous souhaitez renvoyer la chaîne sans le dernier / code>, vous pouvez faire de plusieurs manières. Vous trouverez ci-dessous quelques options utilisant la base R:

à l'aide d'une référence arrière dans gsub () code> ( sub () code> fonctionnerait aussi ici): p> xxx pré>

par position à l'aide de ifelse () code> et substr (() code> (ceci sera un peu plus rapide si la mise à l'échelle est importante) p >

x <- "http://compras.dados.gov.br/materiais/v1/materiais.html?pdm=08275/"


0 commentaires

-1
votes

Que diriez-vous d'essayer gsub ("(. *?) / + $", "\\ 1", s) ?


0 commentaires

0
votes

Utilisez sous pour supprimer un trailing / : xxx

ceci ne change rien sur une chaîne qui ne finit pas dans /.

Les autres ont souligné, grep ne modifie pas les chaînes. Il renvoie un vecteur numérique d'indices des chaînes assorties ou un vecteur des éléments assortis (non modifiés). Il est généralement utilisé pour sous-ensemble un vecteur de caractère.

0 commentaires

0
votes

Vous pouvez utiliser une apparence négative en arrière à la fin pour que cela ne se termine pas avec le caractère que vous ne voulez pas (dans ce cas, un / ). La regex serait alors: xxx

Vous pouvez le voir ici avec vos trois exemples d'entrée: https://regex101.com/r/xb9f7k/1/ . Si vous souhaitez uniquement correspondre aux URL, vous modifiez le . + au début de votre URL Regex.


0 commentaires