Python Regex substitui grupos instantaneamente

106

Existe alguma maneira de substituir diretamente todos os grupos usando a sintaxe regex?

A maneira normal:

re.match(r"(?:aaa)(_bbb)", string1).group(1)

Mas eu quero alcançar algo assim:

re.match(r"(\d.*?)\s(\d.*?)", "(CALL_GROUP_1) (CALL_GROUP_2)")

Quero construir a nova string instantaneamente a partir dos grupos que o Regex acabou de capturar.

mc_kaiser
fonte

Respostas:

189

Dê uma olhada em re.sub:

result = re.sub(r"(\d.*?)\s(\d.*?)", r"\1 \2", string1)

Esta é a função de substituição (substituição) de regex do Python. A string de substituição pode ser preenchida com as chamadas referências anteriores (barra invertida, número do grupo) que são substituídas pelo que foi correspondido pelos grupos. Os grupos são contados da mesma forma que a group(...)função, ou seja, começando 1da esquerda para a direita abrindo parênteses.

Martin Ender
fonte
4
Muito mais claro do que o doc! Não entendia como o grupo estava trabalhando com este. Eles deveriam adicionar esse exemplo.
Y0da de
funcionou desde o primeiro momento, esta é uma maneira muito boa e clara de explicar. Obrigado e você pode explicar como o subgrupo deve estar ligando de forma adequada em alguma (r(r))r((r)((r)r))situação?
Rakshitha Muranga Rodrigo
1
@RakshithaMurangaRodrigo Os grupos são numerados da esquerda para a direita, passando por onde começam. Então, se eu inserir o número certo de cada grupo na frente do grupo, eles estariam classificadas: 1(r2(r))r3(4(r)5(6(r)r)).
Martin Ender
@MartinEnder: Muito obrigado!
Rakshitha Muranga Rodrigo
30

A resposta aceita é perfeita. Eu acrescentaria que a referência de grupo provavelmente é melhor alcançada usando esta sintaxe:

r"\g<1> \g<2>"

para a string de substituição. Dessa forma, você contorna as limitações de sintaxe em que um grupo pode ser seguido por um dígito. Novamente, tudo isso está presente no documento, nada de novo, apenas às vezes difícil de detectar à primeira vista.

benelgíaco
fonte