¿Cómo puedo unir una secuencia de caracteres idénticos en solo uno?

Supongamos que tengo esto:

Mi — sol – es —— muy grande —.

Quiero reemplazar todos los guiones múltiples con un solo guión.

import re astr='My---sun--is------very-big---.' print(re.sub('-+','-',astr)) # My-sun-is-very-big-. 

Si desea reemplazar cualquier serie de caracteres consecutivos, puede utilizar

 >>> import re >>> a = "AA---BC++++DDDD-EE$$$$FF" >>> print(re.sub(r"(.)\1+",r"\1",a)) A-BC+DE$F 

Si solo desea fusionar caracteres que no sean palabras, use

 >>> print(re.sub(r"(\W)\1+",r"\1",a)) AA-BC+DDDD-EE$FF 

Si realmente son solo guiones, recomiendo la solución de Unutbu.

Si realmente solo desea fusionar guiones, utilice las otras sugerencias. De lo contrario, puedes escribir tu propia función, algo como esto:

 >>> def coalesce(x): ... n = [] ... for c in x: ... if not n or c != n[-1]: ... n.append(c) ... return ''.join(n) ... >>> coalesce('My---sun--is------very-big---.') 'My-sun-is-very-big-.' >>> coalesce('aaabbbccc') 'abc' 

Como de costumbre, hay una buena solución de itertools , usando groupby :

 >>> from itertools import groupby >>> s = 'aaaaa----bbb-----cccc----ddd' >>> ''.join(key for key, group in groupby(s)) 'abcddd' 

Qué tal si:

 >>> import re >>> re.sub("-+", "-", "My---sun--is------very-big---.") 'My-sun-is-very-big-.' 

la expresión regular "-+" buscará 1 o más "-" .

 re.sub('-+', '-', "My---sun--is------very-big---") 

¿Qué tal una alternativa sin el módulo de re:

 '-'.join(filter(lambda w: len(w) > 0, 'My---sun--is------very-big---.'.split("-"))) 

O siguiendo la sugerencia anterior de Tim y FogleBird, aquí hay un método más general:

 def coalesce_factory(x): return lambda sent: x.join(filter(lambda w: len(w) > 0, sent.split(x))) hyphen_coalesce = coalesce_factory("-") hyphen_coalesce('My---sun--is------very-big---.') 

Aunque personalmente, usaría el módulo re primero 🙂

  • Mcpeterson

Otra solución simple es la función de reemplazo del objeto String.

 while '--' in astr: astr = astr.replace('--','-') 

Si no quieres usar expresiones regulares:

  my_string = my_string.split('-') my_string = filter(None, my_string) my_string = '-'.join(my_string) 

yo tengo

 my_str = 'a, b,,,,, c, , , d' 

quiero

 'a,b,c,d' 

comprima todos los espacios en blanco (el bit “reemplazar”), luego divida en la coma, y ​​si no es que Ninguno se une con una coma en medio:

 my_str_2 = ','.join([i for i in my_str.replace(" ", "").split(',') if i])