0
votes

Regex à changer \ par /

J'ai une chaîne comme ci-dessous:

str_1 = 'Mon idée \ but est de changer \\ "this \\"'

Je veux changer de glash entre l'idée et l'objectif de sorte qu'il devienne idée / but mais sans changer la barre oblique inverse des guillemets \\ "\\" .

J'ai essayé avec la regex suivante:

str_2 = re.sub (r '([\ w] *) \\ ([\ w] *)', r "\ 1 / \ 2", str_1)

Cependant, cela change toutes les backslashes. Quelqu'un peut-il m'aider? Merci beaucoup d'avance


3 commentaires

Changer que les backslashes ne sont pas suivies de citations? re.sub (r '\\ ([^ "])', r '/ \ 1', str_1))


Vous voulez obtenir mon idée / but est de changer / \ "this / \" ou mon idée / but est de changer \\ "this \\" ?


Remarque, en passant, que la glash entre le "A" et le "g" dans la liaison littérale à STR1 doit vraiment être doublée, bien que votre code fonctionne comme prévu, car il n'y a actuellement aucun défini < Code> \ g String Escape.


4 Réponses :


1
votes

Je remplacerais les barreaux backslash uniquement si à la fin de la chaîne ou non suivi de la citation: xxx

ceci capture le caractère backslash + suivant (ou fin de ligne) et remplace par slash + ce personnage. Le résultat est le suivant: xxx

Notez que l'utilisation de préfixes bruts est préférable d'éviter que \ est interprété par Python. Dans votre exemple, cela fonctionne car \ g ne veut rien dire mais avec \ n il échouera à moins que les backslashes soient doublés ou r préfixe est avant La chaîne (auquel cas une seule glash en arrière est nécessaire partout) xxx


0 commentaires

-2
votes

Puisque vous ne voulez que remplacer la première barre oblique, la solution la plus simple serait xxx

à l'aide du module RE lorsqu'il est inutile est une cause fréquente de problèmes pour ceux nouveaux à python.


3 commentaires

Sauf lorsque vous essayez de savoir comment les expressions régulières de Python se comportent pour certaines tâches.


Les exercices d'apprentissage sont toujours légitimes. @ Réponse de Mjrezaee à l'aide de la "assertion de lookahead négatif" qui ne consomme aucun caractère car assorti est difficile à battre.


Malgré les bowvotes, je quitte cette réponse visible, car la question ne demandait pas spécifiquement une solution à base de regex, et les débutants n'étaient souvent pas au courant des alternatives beaucoup plus simples qui devraient presque toujours être préférées.



3
votes

Vous pouvez utiliser (\\\) (?! ") qui indique les backslashes qui ne sont pas suivies de citations doubles xxx

sortie: < Pré> xxx


0 commentaires

0
votes

Reprise de votre propre idée initiale ( re.sub (r '([\ w] *) \\ ([\ w] *)', r "\ 1 / \ 2", str_1) ), qui veut évidemment remplacer seulement entre 2 mots - le réparer simplement comme ceci: xxx

( + au lieu de * veut au moins un caractère; [] n'est pas nécessaire avec un élément ( \ w ) uniquement)


0 commentaires