separar regulares por minusculas minuscula mayusculas mayuscula expresiones ejemplos determinar convertir caracter cadenas python regex capitalization

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



python string expresiones regulares (6)

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 usando la siguiente expresión regular y puedo hacer coincidir las letras 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''([A-Z]){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?


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''([A-Z]){2}'', toLowercase, s) >>> ''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''([A-Z])/1'', replacement, ''start TT end'') ''start t end''


Prueba esto:

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

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


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| .


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''([A-Z]){2}'', callback, s)

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

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

Da:

''start t end''


¡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 codificación 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 """