Chaîne Python remplacer le caractère par l'expression régulière [dupliquer]

Nov 27 2020

J'ai rencontré un problème de regex que je ne comprends pas. J'essaie de remplacer une virgule entre les chaînes par un point-virgule et cela ne fonctionne pas. Voici un exemple de chaîne ci-dessous. J'ai mis en place une expression régulière pour remplacer tout sauf le contenu après "séquence" dans un groupe d'expression régulière sans capture, de sorte que la virgule à la fin soit remplacée par la seule sous-chaîne du groupe non capture, le point-virgule. Mais ça ne marche pas. Il semble ne conserver aucune des chaînes lorsque je mets (?: Sequence :) comme groupes non capturés. Dès que j'ajoute \ d, il remplace le tout. Je ne sais pas pourquoi.

Dans mon vrai problème, j'ai une série de balises de contenu marquées d'un deux-points et se terminant par un point-virgule. Dans la séquence de balises, il y a une virgule erronée au lieu d'un point-virgule que je dois remplacer mais laissez tout inchangé. Ainsi, la solution devrait simplement changer de séquence: 2, en séquence: 2;

a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(?:sequence\:)(?:\d)(\,)", ";", a_string)

new_string

J'ai regardé d'autres solutions qui devraient fonctionner, mais pas pour cela. Toute aide est appréciée et s'il vous plaît laissez-moi savoir si je peux clarifier cette question.

Réponses

1 TimBiegeleisen Nov 27 2020 at 06:17

Vous avez probablement eu l'intention d'utiliser un regard négatif positif ici:

a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(?<=\bsequence:\d)(\,)", ";", a_string)

print(new_string)

Cela imprime:

tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2; tag4: content4

À propos, si vous souhaitez faire correspondre sequencedirectement le texte avant la virgule cible, c'est très bien, mais remplacez-le également en utilisant un groupe de capture:

a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(sequence:\d)(\,)", "\\1;", a_string)
print(new_string)   # same as above