Usar una expresión regular para reemplazar mayúsculas en python con una sola letra en minúscula

Estoy tratando de reemplazar cualquier instancia de letras mayúsculas que se repitan dos veces en una cadena con una sola instancia de esa letra en minúscula. Estoy utilizando la siguiente expresión regular y puedo hacer coincidir las mayúsculas repetidas, pero no estoy seguro de cómo hacer que la letra que está siendo reemplazada sea minúscula.

import re s = 'start TT end' re.sub(r'([AZ]){2}', r"\1", s) >>> 'start T end' 

¿Cómo puedo hacer la minúscula “\ 1”? ¿No debería usar una expresión regular para hacer esto?

Related of "Usar una expresión regular para reemplazar mayúsculas en python con una sola letra en minúscula"

Pasa una función como el argumento de repl . El MatchObject se pasa a esta función y .group(1) proporciona el primer subgrupo entre paréntesis:

 import re s = 'start TT end' callback = lambda pat: pat.group(1).lower() re.sub(r'([AZ]){2}', callback, s) 

EDITAR
Y sí, debe usar ([AZ])\1 lugar de ([AZ]){2} para no coincidir, por ejemplo, AZ . (Ver la respuesta de @ bobince.)

 import re s = 'start TT end' re.sub(r'([AZ])\1', lambda pat: pat.group(1).lower(), s) # Inline 

Da:

 'start t end' 

No puedes cambiar el caso en una cadena de reemplazo. Necesitarías una función de reemplazo:

 >>> def replacement(match): ... return match.group(1).lower() ... >>> re.sub(r'([AZ])\1', replacement, 'start TT end') 'start t end' 

Puedes hacerlo con una expresión regular, solo pasa una función como reemplazo, como dicen los documentos . El problema es tu patrón.

Tal como está, su patrón coincide con carreras de dos letras mayúsculas. Te dejaré el patrón real, pero comienza con AA|BB|CC| .

El parámetro ‘repl’ que identifica el reemplazo puede ser una cadena (como la tiene aquí) o una función. Esto hará lo que desees:

 import re def toLowercase(matchobj): return matchobj.group(1).lower() s = 'start TT end' re.sub(r'([AZ]){2}', toLowercase, s) >>> 'start t end' 

Prueba esto:

 def tol(m): return m.group(0)[0].lower() s = 'start TTT AAA end' re.sub(r'([AZ]){2,}', tol, s) 

Tenga en cuenta que esto no sustituye a las letras más altas. Si quieres hacerlo, usa r'([AZ]){1,}' .

¡ADVERTENCIA! Esta publicación no tiene ninguna respuesta a lo solicitado. ¡Continúa con tu propia responsabilidad!

No sé cómo son posibles los casos de esquina, pero así es como Python normal hace mi encoding ingenua.

 import string s = 'start TT end AAA BBBBBBB' for c in string.uppercase: s = s.replace(c+c,c.lower()) print s """ Output: start t end aA bbbB """