2010-05-11 2 views
7

Предположим, у меня есть:Как объединить последовательность одинаковых символов в одну?

My --- sun - is ------ very-big ---.

Я хочу заменить все несколько дефис только одним дефисом.

+3

Вы действительно хотите сливаться только дефиса или любой запуск повторяющихся символов? –

ответ

16
import re 

astr='My---sun--is------very-big---.' 

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

+1, но '- {2,}' не будет необходимости заменять одиночный '-'. –

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

Как насчет:

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

регулярное выражение "-+" будет искать 1 или более "-".

5

Если вы действительно хотите объединить дефисы, используйте другие предложения. В противном случае вы можете написать свою собственную функцию, что-то вроде этого:

>>> 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' 
+0

+1 для общего решения. Так как OP использовал английские слова в своем примере, указание набора символов для объединения (или не объединения), вероятно, было бы предпочтительным, чтобы избежать искажения слов с двойными буквами (то есть буквы -> буклеты). – tgray

+0

Согласовано с +1 для общего решения – mcpeterson

5

Как обычно, есть хороший 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' 
+1

Это решение не отвечает на вопрос, только если вы хотите дедуплировать дефисы. Есть ли решение itertools, которое будет содержать aaaaa? – mcpeterson

+2

@McPeterson: Конечно, но они не такие приятные. Для простоты дефисов вы можете делать '' '.join (key if key == '-' else '. .join (group) для ключа, group in groupby (s)). Для обработки любого не-буквенно-цифрового символа «.» .join (''. Join (group), если key.isalnum() else ключ для клавиши, group in groupby (s)). Но я бы просто использовал одно из решений regex. –

13

Если вы хотите заменить любой пробег последовательных символов , вы можете использовать

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

1

Как насчет альтернативной без модуля 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---.') 

Хотя лично я хотел бы использовать повторно модуль первый :)

  • mcpeterson
0

Другим простым решением является функция замены объекта String.

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

, если вы не хотите использовать регулярные выражения:

my_string = my_string.split('-') 
    my_string = filter(None, my_string) 
    my_string = '-'.join(my_string) 
Смежные вопросы