Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

359
Vistas
¿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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda