Chaîne Python remplacer le caractère par l'expression régulière [dupliquer]
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
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 sequence
directement 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