Как объединить последовательность одинаковых символов в один? - PullRequest
7 голосов
/ 11 мая 2010

Предположим, у меня есть это:

My --- ВС - это ------ очень-большой ---

.

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

Ответы [ 10 ]

16 голосов
/ 11 мая 2010
import re

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

print(re.sub('-+','-',astr))
# My-sun-is-very-big-.
13 голосов
/ 12 мая 2010

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

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

5 голосов
/ 12 мая 2010

Как обычно, есть хорошее решение 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'
5 голосов
/ 11 мая 2010

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

>>> 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'
2 голосов
/ 11 мая 2010

Как насчет:

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

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

1 голос
/ 12 мая 2010

Как насчет альтернативы без повторного модуля:

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

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

  • mcpeterson
1 голос
/ 11 мая 2010
re.sub('-+', '-', "My---sun--is------very-big---")
0 голосов
/ 20 января 2019

у меня

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

хочу

'a,b,c,d'

сжимает все пробелы (бит "замена"), затем разделяет запятую, а затем, если нет, соединяет запятую между:

my_str_2 = ','.join([i for i in my_str.replace(" ", "").split(',') if i])
0 голосов
/ 08 декабря 2014

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

    my_string = my_string.split('-')
    my_string = filter(None, my_string)
    my_string = '-'.join(my_string)
0 голосов
/ 12 мая 2010

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

while '--' in astr:
    astr = astr.replace('--','-')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...