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.

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.