4
votes

Remplacer la chaîne par une condition regex

J'ai un modèle que je veux faire correspondre et remplacer par un X. Cependant, je veux que le modèle soit remplacé uniquement si le caractère précédent est un A, B ou n'est précédé d'aucun caractère (début de chaîne).

Je sais comment remplacer des motifs en utilisant la fonction str_replace_all mais je ne sais pas comment ajouter cette condition supplémentaire. J'utilise le code suivant:

[1] "XXXXAXXXXBXXXXC0000D0000E0000AXXXX"

Résultat :

[1] "XXXXAXXXXBXXXXCXXXXDXXXXEXXXXAXXXX"

Résultat souhaité:

Remplacement uniquement lorsque l'affréteur précédent est A, B ou aucun caractère:

library(stringr)

string <- "0000A0000B0000C0000D0000E0000A0000"
pattern <- c("XXXX")



replacement <- str_replace_all(string, pattern, paste0("XXXX"))


0 commentaires

3 Réponses :


3
votes

Vous pouvez utiliser

string <- "0000A0000B0000C0000D0000E0000A0000"
pattern <- c("XXXX")
gsub("(^|[AB])0000", "\\1XXXX", string)
## -> [1] "XXXXAXXXXBXXXXC0000D0000E0000AXXXX"

Voir la démo regex a >

Détails

  • (^ | [AB]) - Groupe de capture 1 ( \ 1 ): début de chaîne ( ^ ) ou ( | ) A ou B ( [AB] )
  • 0000 - quatre zéros.

Démo R :

gsub("(^|[AB])0000", "\\1XXXX", string)

p>


2 commentaires

Merci pour la belle regex ++ ve, hé que diriez-vous que j'utilise [\\ ^ AB] , est-ce que ça le prendra comme une négation de AB? Ou cela prendra ^ comme début ici? Pourriez-vous s'il vous plaît guider ici.


@ RavinderSingh13 Dans une regex TRE, [\\ ^ AB] correspond à l'un des 4 caractères: \ , ^ , A < / code> ou B .



0
votes

Pourriez-vous s'il vous plaît essayer de suivre. En utilisant la méthode de recherche positive ici.

[1] "xxxxAxxxxBxxxxC0000D0000E0000Axxxx"

La sortie sera la suivante.

string <- "0000A0000B0000C0000D0000E0000A0000"
gsub(x = string, pattern = "(^|A|B)(?=0000)((?i)0000?)",
    replacement = "\\1xxxx", perl=TRUE)


3 commentaires

Pourquoi (? I) 0000? ? 0 est un caractère sans casse. (? = 0000) ((? i) 0000?) = 0000 . Cette réponse est une copie de la mienne, mais avec un modèle très obscur (et moins efficace). Similaire à l'écriture de (?! [A-XZ]) [A-Z] pour correspondre uniquement à Y .


@ WiktorStribiżew, pour être très honnête, je n'avais pas l'intention de copier votre réponse, j'ai pensé à une autre façon de regarder en avant positif que j'apprends à partir de maintenant, soyez avec moi. Essayer d'apprendre les regex.


Je ne voulais pas dire que vous avez copié mon modèle, je veux dire que c'est la même solution si vous supprimez toutes les ambiguïtés et la redondance du modèle. Il montre comment il ne faut pas écrire d'expressions régulières: elles doivent être claires et directes et ne doivent pas cacher la pensée ou l'intention de l'auteur de l'expression régulière originale.



0
votes

Merci à Wiktor Stribiżew pour la réponse! Il fonctionne également avec le package stringr:

library(stringr)

string <- "0000A0000B0000C0000D0000E0000A0000"
pattern <- c("0000")

replace <- str_replace_all(string, paste0("(^|[AB])",pattern), "\\1XXXX")
replace

[1] "XXXXAXXXXBXXXXC0000D0000E0000AXXXX"


0 commentaires