Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

368
Visualizações
¿Por qué re.sub reemplaza todo el patrón, no solo un grupo de captura dentro de él?

re.sub('a(b)','d','abc') produce dc , no adc .

¿Por qué re.sub reemplaza todo el grupo de captura, en lugar de solo capturar el grupo '(b)'?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Porque se supone que reemplaza toda la aparición del patrón:

Devuelve la cadena obtenida al reemplazar las ocurrencias no superpuestas del extremo izquierdo del patrón en la cadena por el reemplazo repl.

Si fuera a reemplazar solo algún subgrupo, entonces las expresiones regulares complejas con varios grupos no funcionarían. Hay varias soluciones posibles:

  1. Especifique el patrón completo: re.sub('ab', 'ad', 'abc') - mi favorito, ya que es muy legible y explícito.
  2. Capture los grupos que desea conservar y luego haga referencia a ellos en el patrón (tenga en cuenta que debe ser una cadena sin formato para evitar que se escape): re.sub('(a)b', r'\1d', 'abc')
  3. Similar a la opción anterior: proporcione una función de devolución de llamada como argumento repl y haga que procese el objeto Match y devuelva el resultado requerido.
  4. Use lookbehinds/lookaheds, que no están incluidos en la coincidencia, pero afectan la coincidencia: re.sub('(?<=a)b', r'd', 'abxb') produce adxb . El ?<= al comienzo del grupo dice "es una anticipación".
over 4 years ago · Santiago Trujillo Relatório

0

Porque eso es exactamente lo que re.sub() doc te dice que debe hacer:

  • el patrón 'a(b)' dice "coincide con 'a', con 'b' final opcional". (Podría coincidir con 'a' por sí solo, pero no hay forma de que pueda coincidir con 'b' por sí solo como parece esperar. Si quiso decir eso, use un (a)??b no codicioso).
  • la cadena de reemplazo es 'd'
  • por lo tanto, en su cadena 'abc', coincide con todo 'ab' y lo reemplaza con 'd', por lo que el resultado es 'dc'

Si desea el resultado deseado, necesitaría una coincidencia no codiciosa en '(a)??' :

 >>> re.sub('(a)??b','d','abc') 'dc'
over 4 years ago · Santiago Trujillo Relatório

0

Soy consciente de que esto no responde estrictamente a la pregunta OP, pero esta pregunta puede ser difícil de buscar en Google (inundada por \ 1 explicación ...)

para aquellos que como yo vinieron aquí porque les gustaría reemplazar un grupo de captura que no es el primero por una cadena, sin un conocimiento especial de la cadena ni de la expresión regular:

 #find offset [start, end] of a captured group within string r = regex.search(oldText).span(groupNb) #slice the old string and insert replacementText in the middle newText = oldText[:r[0]] + replacementText + oldText[r[1]:]

Sé que es el comportamiento deseado, pero aún no entiendo por qué re.sub no puede especificar el grupo de captura real que debe sustituir en...

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda