2010-05-11 37 views

回答

16
import re 

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

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

+1,但' - {2,}'将避免不必要地替换单个'-'。 – 2010-05-12 08:37:51

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 2010-05-11 20:00:51

+0

针对通用解决方案的+1达成一致 – mcpeterson 2010-05-11 21:43:09

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 2010-05-11 22:18:06

+2

@McPeterson:当然,但他们不太好。为了处理连字符,你可以做'''。加入(key如果key ==' - 'else''.join(group)for key,groupby groupby(s))'。为了处理任何非字母数字字符,'''.join(''。join(group)if key.isalnum()else key for group,groupby(s))''。但我只是使用其中一个正则表达式解决方案。 – 2010-05-11 22:48:50

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

如何不重模块的替换:

'-'.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) 
相关问题