Supposons que j'ai ceci: p>
My --- Sun - est ------ très gros ---. p>
Je veux remplacer tous les deux traits d'union avec un seul trait d'union. P>
10 Réponses :
import re
astr='My---sun--is------very-big---.'
print(re.sub('-+','-',astr))
# My-sun-is-very-big-.
+1, mais - {2,} code> éviterait de remplacer un seul - code> inutilement.
re.sub('-+', '-', "My---sun--is------very-big---")
Que diriez-vous:
>>> import re
>>> re.sub("-+", "-", "My---sun--is------very-big---.")
'My-sun-is-very-big-.'
Si vous voulez vraiment seulement fusionner des traits d'union, utilisez les autres suggestions. Sinon, vous pouvez écrire votre propre fonction, 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'
+1 pour une solution générale. Étant donné que l'OP a utilisé des mots anglais dans leur exemple, la spécification d'un ensemble de caractères à coalesce (ou non de regroupement) serait probablement préférable de manière à éviter des mots de mangling à deux lettres (c'est-à-dire des lettres).
Convenu sur le +1 pour une solution générale
Comme d'habitude, il y a une solution code> iTertools code>, à l'aide de groupby code>:
Cette solution ne répond pas à la question si vous voulez seulement déduire les traits d'union. Y a-t-il une solution iTertools qui garderait «AAAAA»?
@Mcpeterson: Bien sûr, mais ils ne sont pas aussi gentils. Pour simplement gérer des traits d'union, vous pouvez faire ''. Joindre (clé si toule == '- «Autres» .join (groupe) pour la clé, groupe en groupeby (s)) code>. Pour manipuler tout caractère non alphanumérique, ''. Joindre ('. Joindre (groupe) si clé.isalnum () Sinon Touche pour la clé, groupe en groupeby (s)) code>. Mais j'utiliserais plutôt l'une des solutions de regex à la place.
Si vous souhaitez remplacer tout em> exécution de caractères consécutifs, vous pouvez utiliser >>> print(re.sub(r"(\W)\1+",r"\1",a))
AA-BC+DDDD-EE$FF
Que diriez-vous d'une alternative sans le module RE:
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---.')
Une autre solution simple est la fonction de remplacement de l'objet de chaîne.
while '--' in astr:
astr = astr.replace('--','-')
Cela sera très inefficace en cas de texte important.
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)
J'ai je veux p> compresser toutes les ébauches (le "remplacer"), puis diviser sur la virgule , alors sinon personne ne rejoint avec une virgule entre: p>
Voulez-vous vraiment coalcer uniquement des traits d'union, ou une série de caractères en double?