Cadeia de caracteres do Python substitui o caractere por regex [duplicado]

Nov 27 2020

Encontrei um problema de regex que não entendo. Estou tentando substituir uma vírgula entre as strings por um ponto e vírgula e não está funcionando. Aqui está um exemplo de string abaixo. Eu configurei uma regex para substituir tudo, exceto o conteúdo após "sequência" em um grupo de não captura de regex, de modo que a vírgula no final deve ser substituída pela única substring no grupo de não captura, o ponto e vírgula. Mas não funciona. Parece apenas preservar qualquer string quando coloco (?: Sequence :) como os grupos de não captura. Assim que eu adicionar \ d, ele substitui tudo. Não tenho certeza do porquê.

No meu problema real, tenho uma série de tags de conteúdo marcadas com dois pontos e terminadas com um ponto e vírgula. Na sequência da tag, há uma vírgula errada em vez de ponto-e-vírgula que preciso substituir, mas deixar tudo inalterado. Portanto, a solução deve apenas mudar a sequência: 2, para a sequência: 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

Procurei outras soluções que deveriam funcionar, mas não para isso. Agradecemos qualquer ajuda e, por favor, deixe-me saber se eu posso deixar essa questão mais clara.

Respostas

1 TimBiegeleisen Nov 27 2020 at 06:17

Você provavelmente pretendia usar uma visão negativa positiva aqui:

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)

Isso imprime:

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

A propósito, se você deseja corresponder o sequencetexto antes da vírgula de destino diretamente, tudo bem, mas substitua-o também usando um grupo de captura:

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