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 🙂
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])