Предположим, у меня есть:Как объединить последовательность одинаковых символов в одну?
My --- sun - is ------ very-big ---.
Я хочу заменить все несколько дефис только одним дефисом.
Предположим, у меня есть:Как объединить последовательность одинаковых символов в одну?
My --- sun - is ------ very-big ---.
Я хочу заменить все несколько дефис только одним дефисом.
import re
astr='My---sun--is------very-big---.'
print(re.sub('-+','-',astr))
# My-sun-is-very-big-.
+1, но '- {2,}' не будет необходимости заменять одиночный '-'. –
re.sub('-+', '-', "My---sun--is------very-big---")
Как насчет:
>>> import re
>>> re.sub("-+", "-", "My---sun--is------very-big---.")
'My-sun-is-very-big-.'
регулярное выражение "-+"
будет искать 1 или более "-"
.
Если вы действительно хотите объединить дефисы, используйте другие предложения. В противном случае вы можете написать свою собственную функцию, что-то вроде этого:
>>> 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 для общего решения. Так как OP использовал английские слова в своем примере, указание набора символов для объединения (или не объединения), вероятно, было бы предпочтительным, чтобы избежать искажения слов с двойными буквами (то есть буквы -> буклеты). – tgray
Согласовано с +1 для общего решения – mcpeterson
Как обычно, есть хороший itertools
решение, используя 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'
Это решение не отвечает на вопрос, только если вы хотите дедуплировать дефисы. Есть ли решение itertools, которое будет содержать aaaaa? – mcpeterson
@McPeterson: Конечно, но они не такие приятные. Для простоты дефисов вы можете делать '' '.join (key if key == '-' else '. .join (group) для ключа, group in groupby (s)). Для обработки любого не-буквенно-цифрового символа «.» .join (''. Join (group), если key.isalnum() else ключ для клавиши, group in groupby (s)). Но я бы просто использовал одно из решений regex. –
Если вы хотите заменить любой пробег последовательных символов , вы можете использовать
>>> import re
>>> a = "AA---BC++++DDDD-EE$$$$FF"
>>> print(re.sub(r"(.)\1+",r"\1",a))
A-BC+D-E$F
Если вы хотите, чтобы сливаться несловообразующим-символы, используйте
>>> print(re.sub(r"(\W)\1+",r"\1",a))
AA-BC+DDDD-EE$FF
Если это действительно дефис, я рекомендую решение unutbu.
Как насчет альтернативной без модуля Re:
'-'.join(filter(lambda w: len(w) > 0, 'My---sun--is------very-big---.'.split("-")))
Или идти с Тимом и FogleBird в предыдущем предложении, вот более общий метод:
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---.')
Хотя лично я хотел бы использовать повторно модуль первый :)
Другим простым решением является функция замены объекта String.
while '--' in astr:
astr = astr.replace('--','-')
, если вы не хотите использовать регулярные выражения:
my_string = my_string.split('-')
my_string = filter(None, my_string)
my_string = '-'.join(my_string)
Вы действительно хотите сливаться только дефиса или любой запуск повторяющихся символов? –