Supongamos que tengo esto:¿Cómo combino una secuencia de caracteres idénticos en uno solo?
Mi --- sol - es ------ muy grande ---.
Quiero reemplazar todos los guiones múltiples con solo un guion.
Supongamos que tengo esto:¿Cómo combino una secuencia de caracteres idénticos en uno solo?
Mi --- sol - es ------ muy grande ---.
Quiero reemplazar todos los guiones múltiples con solo un guion.
import re
astr='My---sun--is------very-big---.'
print(re.sub('-+','-',astr))
# My-sun-is-very-big-.
+1, pero '- {2,}' evitaría reemplazar el '-' solo innecesariamente. –
re.sub('-+', '-', "My---sun--is------very-big---")
¿Qué tal:
>>> import re
>>> re.sub("-+", "-", "My---sun--is------very-big---.")
'My-sun-is-very-big-.'
la expresión regular "-+"
buscará 1 o más "-"
.
Si realmente solo desea unir guiones, use las otras sugerencias. De lo contrario, puede escribir su 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'
+1 para una solución general. Dado que el OP usaba palabras en inglés en su ejemplo, probablemente sería preferible especificar un conjunto de caracteres para fusionarse (o no), a fin de evitar que las palabras se doblen (es decir, letras -> letras). – tgray
Acordó el +1 para una solución general – mcpeterson
Como de costumbre, hay una buena solución itertools
, utilizando groupby
:
>>> from itertools import groupby
>>> s = 'aaaaa----bbb-----cccc----d-d-d'
>>> ''.join(key for key, group in groupby(s))
'a-b-c-d-d-d'
Esta solución no responde a la pregunta si solo desea deduir los guiones. ¿Hay una solución de itertools que mantendría 'aaaaa'? – mcpeterson
@McPeterson: Claro, pero no son tan agradables. Solo por el manejo de guiones, puede hacer '''.join (clave si key == '-' else '' .join (grupo) para key, group in groupby (s)) '. Para manejar cualquier carácter no alfanumérico, ''' .join (''. Join (grupo) si key.isalnum() else tecla para clave, grupo en groupby (s))'. Pero simplemente usaría una de las soluciones de expresiones regulares. –
Si desea reemplazar cualquier racha de caracteres consecutivos , puede utilizar
>>> import re
>>> a = "AA---BC++++DDDD-EE$$$$FF"
>>> print(re.sub(r"(.)\1+",r"\1",a))
A-BC+D-E$F
Si sólo desea unirse a los no-palabra caracteres, utilice
>>> print(re.sub(r"(\W)\1+",r"\1",a))
AA-BC+DDDD-EE$FF
Si solo son guiones, recomiendo la solución de unutbu.
¿Qué tal un sustituto, sin el módulo de re:
'-'.join(filter(lambda w: len(w) > 0, 'My---sun--is------very-big---.'.split("-")))
O ir con Tim y FogleBird sugerencia anterior, 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, me gustaría utilizar la re primer módulo :)
Otra solución simple es la función de reemplazo del objeto String.
while '--' in astr:
astr = astr.replace('--','-')
si no desea utilizar expresiones regulares:
my_string = my_string.split('-')
my_string = filter(None, my_string)
my_string = '-'.join(my_string)
¿Realmente desea unirse sólo guiones o cualquier racha de caracteres duplicados? –