donné la chaîne J'ai essayé la regex suivante J'ai besoin de cela pour travailler dans une fonction pure regex et Grep, sans utiliser de package de chaîne R.
Merci. P> cas simplifié: strong>
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 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é p> "http://compras.dados.gov.br/materialis/v1/materialis.html?pdm=08275/" code>, j'ai besoin de générer un filtre de regex afin qu'il Ignore le dernier char si c'est un "/". "(http: ////)? compas \\. Dados \\. BR. * \\ ?. * (? à partir de regexr.com/4om61 , mais Il ne fonctionne pas lorsque je rencontre en r comme: p> grep (". * [^ //]" "," A1BC / ", Perl = t, valeur = t) code>, mais toujours Obtenez "A1BC /" au lieu de "A1BC". Toute astuce? Merci. p> p>
4 Réponses :
Si vous souhaitez renvoyer la chaîne sans le dernier à l'aide d'une référence arrière dans par position à l'aide de / code>, vous pouvez faire de plusieurs manières. Vous trouverez ci-dessous quelques options utilisant la base R: gsub () code> ( sub () code> fonctionnerait aussi ici): p> xxx pré> 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/"
Que diriez-vous d'essayer gsub ("(. *?) / + $", "\\ 1", s) code>? p>
Utilisez ceci ne change rien sur une chaîne qui ne finit pas dans sous code> pour supprimer un trailing / code>: /. grep code> 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. P> p>
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 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 / code>). La regex serait alors: . + Code> au début de votre URL Regex. P> p>
Utilisez ceci comme regex:
(?: Http: //)? Compas \ .dados \ .gov \ .br. * \? [^ /] * Code> Il n'est pas nécessaire d'utiliser LookbeHind ici.gsub ('/ $', '', x) code> fera une copie dex code> sans le/ code> à la fin (s'il y en a un Pour l'élément donné dex code>)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
/ code> 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 () code>, 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) code>@FABIOCORREA: Vérifiez ceci: Stackoverflow.com/a/23901600/548225
Juste
grep code> legsub ("/ + $", "" ", x) code>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 () code> cargrep () code> n'est pas conçu pour renvoyer des correspondances partielles. Il est conçu pour renvoyer un index -grep ("c", lettres) code> - mais il peut renvoyer la valeur de la chaîne d'origine au lieu de l'index -grep ("C" , lettres, valeur = t) code>. Je suggérerais d'utiliser une autre fonction de base telle quegsub code> (seul ou avecgrep code>). Lire l'en-tête de valeur dans? Grep code>