2013-03-27 14 views
6

Ich habe eine Benutzer eingegebene Zeichenfolge und ich möchte suchen und ersetzen alle Vorkommen einer Liste von Wörtern mit meiner Ersetzung Zeichenfolge.Ersetzen Sie alle Wörter aus der Wortliste durch eine andere Zeichenfolge in Python

import re 

prohibitedWords = ["MVGame","Kappa","DatSheffy","DansGame","BrainSlug","SwiftRage","Kreygasm","ArsonNoSexy","GingerPower","Poooound","TooSpicy"] 


# word[1] contains the user entered message 
themessage = str(word[1])  
# would like to implement a foreach loop here but not sure how to do it in python 
for themessage in prohibitedwords: 
    themessage = re.sub(prohibitedWords, "(I'm an idiot)", themessage) 

print themessage 

Der obige Code funktioniert nicht, ich bin mir sicher, ich verstehe nicht, wie Python für Schleifen arbeiten.

+0

Sie sollten versuchen, spambayes Implementierung für Python Check-out könnte besser skalierbar sein. – dusual

Antwort

11

Sie können das tun mit einem einzigen Aufruf sub:

big_regex = re.compile('|'.join(map(re.escape, prohibitedWords))) 
the_message = big_regex.sub("repl-string", str(word[1])) 

Beispiel:

>>> import re 
>>> prohibitedWords = ['Some', 'Random', 'Words'] 
>>> big_regex = re.compile('|'.join(map(re.escape, prohibitedWords))) 
>>> the_message = big_regex.sub("<replaced>", 'this message contains Some really Random Words') 
>>> the_message 
'this message contains <replaced> really <replaced> <replaced>' 

Beachten Sie, dass str.replace mit subtilen Bugs führen kann :

>>> words = ['random', 'words'] 
>>> text = 'a sample message with random words' 
>>> for word in words: 
...  text = text.replace(word, 'swords') 
... 
>>> text 
'a sample message with sswords swords' 

während re.sub Verwendung gibt das richtige Ergebnis:

>>> big_regex = re.compile('|'.join(map(re.escape, words))) 
>>> big_regex.sub("swords", 'a sample message with random words') 
'a sample message with swords swords' 

Wie thg435 weist darauf hin, wenn Sie Worte und nicht jeder Teilzeichen Sie die Wortgrenzen auf die regex hinzufügen ersetzen möchten:

big_regex = re.compile(r'\b%s\b' % r'\b|\b'.join(map(re.escape, words))) 

Dies würde 'random' ersetzen in 'random words', aber nicht in 'pseudorandom words'.

+0

können Sie einen Lauf zeigen –

+0

Sie müssten es aufteilen, wenn Sie viele Wörter zu ersetzen hatten, obwohl. – DSM

+0

Sie könnten Ihren Ausdruck in '\ b's einschließen, um zu vermeiden," Schwanz "in" Einzelhändler "zu ersetzen. – georg

4

versuchen Sie dies:

prohibitedWords = ["MVGame","Kappa","DatSheffy","DansGame","BrainSlug","SwiftRage","Kreygasm","ArsonNoSexy","GingerPower","Poooound","TooSpicy"] 

themessage = str(word[1])  
for word in prohibitedwords: 
    themessage = themessage.replace(word, "(I'm an idiot)") 

print themessage 
+0

Dies ist spröde: wie Bakuriu erklärte, bricht es leicht, wenn eines der verbotenen Wörter Teilzeichenfolge eines anderen ist. – Adam

+0

@codesparkle es bedeutet nicht, dass es falsch ist, wählen Sie immer Ihre Option hängt von bestimmten Bedingungen ab –

0

Code:

prohibitedWords =["MVGame","Kappa","DatSheffy","DansGame", 
        "BrainSlug","SwiftRage","Kreygasm", 
        "ArsonNoSexy","GingerPower","Poooound","TooSpicy"] 
themessage = 'Brain' 
self_criticism = '(I`m an idiot)' 
final_message = [i.replace(themessage, self_criticism) for i in prohibitedWords] 
print final_message 

Ergebnis:

['MVGame', 'Kappa', 'DatSheffy', 'DansGame', '(I`m an idiot)Slug', 'SwiftRage', 
'Kreygasm', 'ArsonNoSexy', 'GingerPower', 'Poooound','TooSpicy'] 
Verwandte Themen