2017-01-09 7 views
9

को सेंसर नहीं करता मैं एक पाठ में एक शब्द बाहर को सेंसर करने की कोशिश कर रहा Codecademy पर अजगर कर रहा हूं। कोड काम करता है लेकिन यदि पाठ में अंतिम शब्द शब्द है, तो इसे सेंसर नहीं किया जाएगा।पायथन: पाठ में एक शब्द रोक लगाए लेकिन अंतिम शब्द

मुझे विश्वास है कि for कथन को for x in (text + 1) जैसे बदलने की आवश्यकता है, लेकिन निश्चित रूप से यह एक त्रुटि का कारण बनता है। हम replace() जैसे अंतर्निहित कार्यों का उपयोग नहीं कर रहे हैं?

def censor(text,word): 
    text = text.split() 
    for x in text: 
     if x == word: 
      text[text.index(x)] = "*" * len(word) 
    return " ".join(text) 

print(censor("You dirty guy and dirty boy dirty.", "dirty")) 

यह [You ***** guy and ***** boy dirty.]

+5

मैं तुम्हें 'str का उपयोग करने का सुझाव से काम को बदलने के लिए re.sub उपयोग कर सकते हैं होने के लिए अपने if बयान। प्रतिस्थापित करें 'या 're.sub' – Dmitry

+2

मैं मानता हूं कि आप प्रतिस्थापित नहीं कर सकते हैं लेकिन आप विभाजन, अनुक्रमणिका, लेन, शामिल और प्रिंट का उपयोग कर सकते हैं। सभी का निर्माण-इन कर रहे हैं – crowie

+1

आप अपनी परीक्षा को बदल सकता है विराम चिह्न पट्टी: 'अगर x.translate (कोई नहीं, string.punctuation) == शब्द:' – samgak

उत्तर

17
यह शायद आखिरी निशानी में पूर्ण विराम सहित है

देता है, तो यह "dirty" साथ "dirty." तुलना कर रहा है।

+6

आप जानबूझकर एक समाधान का प्रस्ताव (के बाद से सवाल के संदर्भ में है से परहेज कर रहे हैं कोड अकादमी)? – Darthfett

+0

हां, मुझे सीखना आसान लगता है जब लोग मुझे जवाब में इंगित करते हैं लेकिन इसका पूरी तरह उत्तर नहीं देते हैं। –

14

गंदा के अंतिम घटना 'dirty.' बजाय 'dirty' है। यह replace समारोह का उपयोग करना आसान हो सकता है:

def censor(text,word): 
    return text.replace(word, len(word)*'*') 
बिना बिल्ट-इन कार्य

:

def censor(text,word): 
    while 1: 
     wordPosition = text.find(word) 
     if wordPosition < 0: 
      break 
     text = text[:wordPosition] + len(word)*'*' + text[wordPosition+len(word):] 
    return text 
+2

उन्होंने उल्लेख किया "हम अंतर्निहित कार्यों का उपयोग नहीं कर रहे हैं जैसे प्रतिस्थापन()"। –

+0

यह उन मामलों को कैसे संभालता है जहां सेंसर का शब्द बड़े शब्द का हिस्सा हो सकता है? उदाहरण के लिए, क्या 'गधे' केवल एक शब्द के रूप में दिखाई देने पर सेंसर किया जाता है, या क्या इसे 'हत्यारा' में भी सेंसर किया जाता है? – Darthfett

+2

हाँ, अब के लिए यह हत्यारा 'को सेंसर करेगा - यदि आप एक खोज समारोह वास्तविक शब्द देखने के लिए लागू करना चाहिए ... –

1

है यही कारण है कि पिछले गंदा इसलिए इस प्रकार . होने के कारण, गंदा और गंदे (के बीच अंतर है।)। यहाँ एक तरह से समस्या से निपटने के लिए है:

def censor(text, word): 
    wordlist = text.split() 
    new_words_list = [] 
    for item in wordlist: 
     if item.find(word) > -1: 
      new_words_list.append('*' * len(word)) 
     else: 
      new_words_list.append(item) 
    return " ".join(new_words_list) 

print(censor("You dirty guy and dirty boy dirty.", "dirty")) 

आउटपुट:

You ***** guy and ***** boy ***** 
+3

आप जानबूझकर एक समाधान का प्रस्ताव (के बाद से सवाल कोड अकादमी के संदर्भ में है) से परहेज कर रहे हैं? – Darthfett

+0

@ डार्थफेट हाँ.लेकिन मैंने समस्या से निपटने के लिए अब कोड जोड़ा। किसी एक/ओपी को यह उपयोगी लगेगा। – Inconnu

6

क्रिस्टोफर सही है कि यह एक अवधि के साथ dirty. को dirty की तुलना कर रहा है। जैसा कि आपने कहा आप replace समारोह का उपयोग नहीं कर सकते हैं, तो आप को बदल सकता है

if x.startswith(word) == True: 
+4

आप एक गालियां बकने की क्रिया फिल्टर करने के लिए इस बाहर का विस्तार तो [Crapstone] के निवासियों (https://en.wikipedia.org/wiki/Crapstone) होने की संभावना इस दृष्टिकोण – JonK

+0

सराहना नहीं होता बस 'अगर x.startswith (शब्द):' कृपया, अगर स्टेटमेंट में पाइथन में 'ट्रू' या 'गलत' के लिए स्पष्ट तुलना की आवश्यकता नहीं है। – zwol

1

आप पाठ

import re 
re.sub("word", "new_replaced_word", text) 
संबंधित मुद्दे