पायथन में तार अपरिवर्तनीय हैं (बदला नहीं जा सकता)। इस वजह से, इसका प्रभाव line.replace(...)केवल पुराने को बदलने के बजाय एक नई स्ट्रिंग बनाने के लिए है। आपको उन वर्णों को हटाए जाने के साथ उस चर को नया मान लेने के लिए उसे (असाइन करना ) करना होगा line।
इसके अलावा, आप जिस तरह से कर रहे हैं वह अपेक्षाकृत धीमा, अपेक्षाकृत हल्का होने वाला है। यह भी अनुभवी pythonators के लिए थोड़ा भ्रमित होने की संभावना है, जो एक दोहरी-नेस्टेड संरचना को देखेंगे और एक पल के लिए सोचेंगे कि कुछ और जटिल हो रहा है।
पायथन 2.6 और नए पायथन 2.x संस्करणों * में शुरू, आप इसके बजाय उपयोग कर सकते हैं str.translate, (लेकिन पायथन मतभेदों के लिए पढ़ें):
line = line.translate(None, '!@#$')
या नियमित अभिव्यक्ति के साथ प्रतिस्थापन re.sub
import re
line = re.sub('[!@#$]', '', line)
कोष्ठक में संलग्न वर्ण एक वर्ण वर्ग का गठन करते हैं । lineउस वर्ग में जो भी वर्ण हैं, उन्हें दूसरे पैरामीटर के साथ बदल दिया जाता है sub: एक खाली स्ट्रिंग।
पायथन 3 में, स्ट्रिंग्स यूनिकोड हैं। आपको थोड़ा अलग अनुवाद करना होगा। kevpie ने इसका उत्तर में से एक पर एक टिप्पणी में उल्लेख किया है, और यह प्रलेखनstr.translate में नोट किया गया है ।
translateएक यूनिकोड स्ट्रिंग की विधि को कॉल करते समय , आप दूसरे पैरामीटर को पारित नहीं कर सकते हैं जो हमने ऊपर उपयोग किया था। आप Noneपहले पैरामीटर के रूप में भी पास नहीं हो सकते । इसके बजाय, आप केवल पैरामीटर के रूप में एक अनुवाद तालिका (आमतौर पर एक शब्दकोश) पास करते हैं। यह तालिका पात्रों के क्रमिक मूल्यों (अर्थात ordउन पर कॉल करने का परिणाम ) को उन पात्रों के क्रमिक मूल्यों के लिए मैप करती है, जिन्हें उन्हें प्रतिस्थापित करना चाहिए, या उपयोगी रूप से हमारे लिए-None यह इंगित करने के लिए कि उन्हें हटा दिया जाना चाहिए।
तो एक यूनिकोड स्ट्रिंग के साथ उपरोक्त नृत्य करने के लिए आप कुछ ऐसा कहेंगे
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
यहाँ dict.fromkeysऔर mapएक शब्दकोश युक्त करने के लिए सफलतापूर्वक बनाने के लिए उपयोग किया जाता है
{ord('!'): None, ord('@'): None, ...}
और भी सरल, जैसा कि एक और जवाब देता है , अनुवाद तालिका बनाएं।
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
या उसी अनुवाद तालिका के साथ बनाएँ str.maketrans:
unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))
* पहले के पायथन के साथ अनुकूलता के लिए, आप इसके स्थान पर पास करने के लिए एक "अशक्त" अनुवाद तालिका बना सकते हैं None:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
यहां string.maketransएक अनुवाद तालिका बनाने के लिए उपयोग किया जाता है , जो कि एक स्ट्रिंग है जिसमें 0 से 255 तक के आर्डिनल मान वाले अक्षर हैं।
filterफ़ंक्शन और एक लैम्ब्डा अभिव्यक्ति का उपयोग करने के बारे में कैसेfilter(lambda ch: ch not in " ?.!/;:", line):। सुंदर संक्षिप्त और कुशल भी, मुझे लगता है। बेशक, यह एक नया स्ट्रिंग लौटाता है जिसे आपको एक नाम निर्दिष्ट करना होगा।