grupo python re.sub: número após \ número


183

Como posso substituir foobarcom foo123bar?

Isso não funciona:

>>> re.sub(r'(foo)', r'\1123', 'foobar')
'J3bar'

Isso funciona:

>>> re.sub(r'(foo)', r'\1hi', 'foobar')
'foohibar'

Eu acho que é um problema comum quando se tem algo parecido \number. Alguém pode me dar uma dica sobre como lidar com isso?


2
Esta pergunta foi adicionada às Perguntas frequentes sobre a expressão regular de estouro de pilha , em "Grupos".
Alreralmind

1
Essa pergunta levou muito tempo para ser encontrada, porque ela não apresenta os termos 'grupo de captura' ou 'referência de grupo numerado', mas estou aqui por fim e feliz por você ter perguntado.
Mark Ch

1
Seu problema é que r '\ 112' está sendo interpretado como o literal octal 0112, ASCII'J 'ou 74 decimal. Não é possível ver como forçar a referência anterior' \ 1 'a ser avaliada antes da concatenação de strings ou''.join()
smci

um pequeno desvio da pergunta, alguma maneira de referir todas as correspondências do grupo, ou seja, r '\ <para todas as correspondências> oi'?
Sayan Dey

Respostas:


313

A resposta é:

re.sub(r'(foo)', r'\g<1>123', 'foobar')

Trecho relevante dos documentos:

Além das fugas de caracteres e das referências anteriores, como descrito acima, \ g usará a substring correspondente ao nome do grupo nomeado, conforme definido pela sintaxe (? P ...). \ g usa o número do grupo correspondente; \ g <2> é, portanto, equivalente a \ 2, mas não é ambíguo em uma substituição como \ g <2> 0. \ 20 seria interpretado como uma referência ao grupo 20, não como uma referência ao grupo 2, seguida pelo caractere literal '0'. A referência anterior \ g <0> substitui toda a substring correspondida pelo ER.


48
Não seja tão duro consigo mesmo. Está enterrado na documentação tão profundamente que levaria a maioria das pessoas muito mais tempo para ler os documentos do que para pesquisar suas perguntas no Google e obter essa resposta no SO.
speedplane 01/09/15

1
A citação exata fornecida é encontrada aqui , caso você esteja procurando por contexto
patrick

Posso pegar o grupo e modificá-lo? \ g <1> ... Por exemplo, neste caso, g <1> é foo, mas eu quero mudar o o por você, como este "fuu"
Eric Bellet
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.