2
votes

Remplacement de caractères consécutifs répétés en Python

J'ai besoin de créer une fonction qui remplace les caractères consécutifs répétés par un seul caractère, par exemple:

 'hiiii how are you??' -> 'hi how are you?'
 'aahhhhhhhhhh whyyyyyy' -> 'ah why'
 'foo' -> 'fo'
 'oook. thesse aree enoughh examplles.' -> 'ok. these are enough examples'


1 commentaires

Salut @Santiago M.! Qu'est-ce que tu as essayé jusque-là? Veuillez fournir un code, si c'est possible. Si cette question concerne un devoir, veuillez lire ceci .


5 Réponses :


1
votes

En utilisant une itération simple.

Démo:

hi how are you?
ah why
fo
ok. these are enough examples.

Sortie:

def cleanText(val):
    result = []
    for i in val:
        if not result:
            result.append(i)
        else:
            if result[-1] != i:
                result.append(i)
    return "".join(result)

s = ['hiiii how are you??', 'aahhhhhhhhhh whyyyyyy', 'foo', 'oook. thesse aree enoughh examplles.']
for i in s:
    print(cleanText(i))


0 commentaires

6
votes

Vous pouvez essayer une expression régulière comme (.) \ 1+ , c'est-à-dire "quelque chose, puis plus du même quelque chose", et la remplacer par \ 1 , c'est-à-dire "ce premier quelque chose".

>>> import functools
>>> dedup = functools.partial(re.sub, r"(.)\1+", r"\1")
>>> dedup('oook. thesse aree enoughh examplles.')
'ok. these are enough examples.'

Faites-en une fonction avec functools.partial (ou de toute autre manière que vous aimez)

>>> import re
>>> re.sub(r"(.)\1+", r"\1", 'aahhhhhhhhhh whyyyyyy')
'ah why'
>>> re.sub(r"(.)\1+", r"\1", 'oook. thesse aree enoughh examplles.')
'ok. these are enough examples.'


0 commentaires

3
votes
def dup_char_remover(input):
    output=""
    t=""
    for c in input:
        if t!=c:
            output = output + c
        t=c
    return output

input = "hiiii how arrrre youuu"
output=dup_char_remover(input)
print(output)
hi how are you

0 commentaires

6
votes

Une solution peut être exprimée de manière très compacte en utilisant itertools.groupby :

>>> [remove_repeated_characters(s) 
     for s in ['hiiii how are you??','aahhhhhhhhhh whyyyyyy',
               'foo', 'oook. thesse aree enoughh examplles.']]
['hi how are you?', 'ah why', 'fo', 'ok. these are enough examples.']

itertools.groupby regroupe les objets dans un itérable par la fonction clé donnée. Les groupes sont accumulés tant que les clés sont équivalentes. Si aucune fonction clé n'est donnée, l'identité des éléments est utilisée, dans ce cas les caractères.

Une fois que vous les avez regroupés par leur identité, vous pouvez alors joindre les objets en une seule chaîne. Les objets groupés sont renvoyés sous forme de tuples contenant l'objet et un objet interne itertools._grouper , que pour vos besoins, vous pouvez ignorer et extraire le caractère.

Cela peut être transformé en une fonction comme suit:

def remove_repeated_characters(s):
    groups = itertools.groupby(s)
    cleaned = ''.join(g[0] for g in groups)
    return cleaned

Il en résulte les valeurs attendues:

>>> import itertools
>>> ''.join(g[0] for g in itertools.groupby('hiiii how are you??'))
'hi how are you?'


0 commentaires

0
votes
from collections import OrderedDict

def removeDupWord(word):
   return "".join(OrderedDict.fromkeys(word))

def removeDupSentence(sentence):
    words = sentence.split()
    result = ''
    return ''.join([result + removeDupWord(word) + ' ' for word in words])


sentence = 'hiiii how are you??'
print (removeDupSentence(sentence))

>>> hi how are you? 

0 commentaires