2010-05-11 6 views

Répondre

16
import re 

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

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

+1, mais '- {2,}' éviterait de remplacer un seul '-' inutilement. –

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

Que diriez-vous:

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

l'expression régulière "-+" recherchera 1 ou plus "-".

5

Si vous souhaitez uniquement fusionner les tirets, utilisez les autres suggestions. Sinon, vous pouvez écrire votre propre fonction, quelque chose comme ceci:

>>> 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 pour une solution générale. Puisque l'OP utilisait des mots anglais dans son exemple, spécifier un ensemble de caractères à fusionner (ou non coalescer) serait probablement préférable afin d'éviter de tromper les mots avec des doubles lettres (c'est-à-dire des lettres -> leters). – tgray

+0

D'accord sur le +1 pour une solution générale – mcpeterson

5

Comme d'habitude, il y a une belle solution itertools, en utilisant 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

Cette solution ne répond pas à la question si vous voulez seulement dédoubler les tirets. Y a-t-il une solution itertools qui garderait 'aaaaa'? – mcpeterson

+2

@McPeterson: Bien sûr, mais ils ne sont pas aussi bien. Pour juste gérer les traits d'union, vous pouvez faire '''.join (touche si clé == '-' else '' .join (groupe) pour la clé, groupe dans groupby (s)) '. Pour gérer tout caractère non alphanumérique, ''' .join (''. Join (group) si key.isalnum() else clé pour key, group dans groupby (s))'. Mais j'utiliserais plutôt une des solutions regex à la place. –

13

Si vous voulez remplacer toute série de caractères consécutifs , vous pouvez utiliser

>>> import re 
>>> a = "AA---BC++++DDDD-EE$$$$FF" 
>>> print(re.sub(r"(.)\1+",r"\1",a)) 
A-BC+D-E$F 

Si vous voulez seulement s'unir non-mot-caractères, utilisezSi ce n'est vraiment que des traits d'union, je recommande la solution d'unutBu.

1

Que diriez-vous d'un autre sans le module re:

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

Ou aller avec la suggestion précédente Tim et FogleBird, voici une méthode plus générale:

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

Bien que personnellement, j'utiliser la re Module première :)

  • mcpeterson
0

Une autre solution simple est la fonction replace de l'objet String.

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

si vous ne voulez pas utiliser des expressions régulières:

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