J'ai une demande étrange avec regex dans R. J'ai un vecteur de chaînes de caractères où certains ont plusieurs périodes de fuite. Je veux remplacer ces périodes avec des espaces. L'exemple et le résultat souhaité devraient préciser ce que je suis après (peut-être que je dois l'attaquer avec ce que je donne à remplacer l'argument plutôt que l'argument de modèle de Exemple et tentatives: strong> p> résultat souhaité strong> p> donc le vecteur d'origine (x) eu la dernière chaîne avec 6 périodes à la fin, donc j'aimerais 6 espaces sans toucher la période entre vraiment et laid. Je connais le gsub code>): $ code> regarde à la fin mais ne peut pas passer cela. P> p>
3 Réponses :
Essayez ceci: Explication: strong> p>
Je reçois expression régulière invalide '\. (? = \ \. * $)', Raison "Regexp invalide" code>
@Davidrobinson: à l'intérieur d'une chaîne, vous devez doubler les backslashes.
@Andrie: merci; J'ai déplacé votre édition dans la réponse originale. Pas grand bon sens, laissant le code incomplet debout là-bas.
Je reçois cette erreur même avec votre version double recul, jusqu'à ce que vous ajoutiez Perl = true. Maintenant c'est bon
Ah - vous avez besoin du perl = vrai là-bas. C'est ce que j'avais manqué lors de la traduction de R.
@Davidrobinson: C'était en fait Andrie qui a trouvé cette omission et a corrigé cela. Mais merci quand même :)
Tim élégant et une explication formidable de la solution de regex. IMHO Cela pourrait être un exemple d'une bonne explication de regex
Je ne comprends pas pourquoi les travaux de remplacement ici (la chaîne de remplacement est de 1 caractères). Est-ce parce que (dans un sens) remplace récursivement un . Code> avec un `` jusqu'à ce qu'il échoue au match? (+1 très belle solution au fait; mon cerveau ne comprend juste pas que c'est ce intelligent!)
@Gavinsimpson: aucune récursion n'est impliquée ici. D'abord, le \. Code> correspond à n'importe quel point. Ensuite, l'expression lookahead (? = ...) code> "regarde en avant" dans la chaîne pour voir si la regex contenue à l'intérieur de celui-ci peut être assortie ici. Mais cela ne fait pas réellement d'avancer le moteur de regex à l'intérieur de la chaîne. Donc, dans ce cas, un point n'est assorti que si rien que des points suivent jusqu'à la fin de la chaîne. Et puis le point suivant est assorti et remplacé, puis le suivant ...
@TIMPIETZCKER Merci c'est très clair et comment je pensais que cela pourrait fonctionner mais que je ne l'explique pas assez bien dans mon commentaire. (Aurait probablement dû avoir utilisé «récursivement» à la place car je ne le voulais pas au sens habituel.)
Bien que j'ai attendu une solution de regex qui a du sens, j'ai décidé de trouver une façon absurde de résoudre ce problème: Je dirais que Tim est un peu plus jolie :) p> p>
La solution de Tim est clairement meilleure mais j'ai pensé que je tenterais ma main à une autre manière. Utilisation d'une utilisation libérale de donc pas aussi propre qu'une expression régulière unique. Mais je n'ai jamais vraiment reçu d'apprendre ces expressions régulières de Perl. P> P> RegMatches code> nous aide ici ici
pas aussi propre que Tim's mais toujours une bonne solution (en particulier par rapport à la mienne). +1