如何将一系列相同的字符合并成一个?

8
假设我有这个字符串:
我的---太阳--非常大---。
我想用一个连字符替换所有的多个连字符。

3
你是想合并连字符还是任何重复字符的一系列? - Andrew Jaffe
10个回答

19
import re

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

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

1
+1,但是 -{2,} 可以避免不必要地替换单个 - - Tim Pietzcker

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的解决方案。


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'

+1 为一个通用解决方案。由于原帖中使用了英文单词作为示例,因此最好指定一组要合并(或不合并)的字符,以避免将双字母的单词弄乱(例如 letters -> leters)。 - tgray
同意+1作为通用解决方案。 - mcpeterson

5

通常情况下,使用 itertoolsgroupby 可以得到一个不错的解决方案:

>>> 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) for key, group in groupby(s))。对于处理任何非字母数字字符,''.join(''.join(group) if key.isalnum() else key for key, group in groupby(s))。但我会使用正则表达式解决方案之一。 - Will McCutchen

2
如何呢:
>>> import re
>>> re.sub("-+", "-", "My---sun--is------very-big---.")
'My-sun-is-very-big-.'

正则表达式"-+"将查找1个或多个"-"

1

如果不使用 re 模块,是否有其他可行的替代方案:

'-'.join(filter(lambda w: len(w) > 0, 'My---sun--is------very-big---.'.split("-")))

或者采用Tim和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
re.sub('-+', '-', "My---sun--is------very-big---")

0

另一个简单的解决方案是使用字符串对象的替换函数。

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

在处理大量文本时,这种方法效率非常低下。 - Prokhozhii

0

如果你不想使用正则表达式:

    my_string = my_string.split('-')
    my_string = filter(None, my_string)
    my_string = '-'.join(my_string)

0

我有

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

我想要

'a,b,c,d'

压缩所有空格("replace" 部分),然后在逗号处拆分,如果不是 None,则用逗号连接:

my_str_2 = ','.join([i for i in my_str.replace(" ", "").split(',') if i])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接