सबसे पहले, मैं दूसरों से सहमत होना चाहता हूं कि रेगेक्स या str.translate(...)आधारित समाधान सबसे अधिक प्रदर्शनकारी हैं। मेरे उपयोग के मामले के लिए इस फ़ंक्शन का प्रदर्शन महत्वपूर्ण नहीं था, इसलिए मैं उन विचारों को जोड़ना चाहता था जिन्हें मैंने उस मानदंड के साथ माना था।
मेरा मुख्य लक्ष्य एक समाधान में अन्य उत्तरों में से कुछ से विचारों को सामान्य करना था जो केवल रेगेक्स शब्दों से अधिक स्ट्रिंग्स के लिए काम कर सकते थे (यानी, विखंडन वर्ण बनाम श्वेत सूची वाले वर्णों के स्पष्ट सबसेट को ब्लैकलिस्ट करते हुए)।
ध्यान दें, किसी भी दृष्टिकोण में, string.punctuationएक मैन्युअल रूप से परिभाषित सूची के स्थान पर उपयोग करने पर भी विचार कर सकता है ।
विकल्प 1 - re.sub
मैं अब तक re.sub (...) का उपयोग करता है कोई जवाब नहीं देखकर हैरान था । मैं इसे इस समस्या के लिए एक सरल और प्राकृतिक दृष्टिकोण मानता हूं।
import re
my_str = "Hey, you - what are you doing here!?"
words = re.split(r'\s+', re.sub(r'[,\-!?]', ' ', my_str).strip())
इस समाधान में, मैंने कॉल को re.sub(...)अंदर तक घोंसला दिया re.split(...)- लेकिन यदि प्रदर्शन महत्वपूर्ण है, तो बाहर रेगेक्स को संकलित करना फायदेमंद हो सकता है - मेरे उपयोग के मामले में, अंतर महत्वपूर्ण नहीं था, इसलिए मैं सादगी और पठनीयता पसंद करता हूं।
विकल्प 2 - str.replace
यह कुछ और पंक्तियाँ हैं, लेकिन इसका विस्तार होने के बिना यह जांचने का लाभ है कि क्या आपको regex में एक निश्चित चरित्र से बचने की आवश्यकता है।
my_str = "Hey, you - what are you doing here!?"
replacements = (',', '-', '!', '?')
for r in replacements:
my_str = my_str.replace(r, ' ')
words = my_str.split()
इसके बजाय str.replace को स्ट्रिंग में मैप करना अच्छा होता, लेकिन मुझे नहीं लगता कि इसे अपरिवर्तनीय स्ट्रिंग्स के साथ किया जा सकता है, और वर्णों की एक सूची के खिलाफ मैपिंग करते समय, हर चरित्र के विरुद्ध हर प्रतिस्थापन को चलाने में मदद मिलेगी। अत्यधिक लगता है। (संपादित करें: एक कार्यात्मक उदाहरण के लिए अगला विकल्प देखें।)
विकल्प 3 - configools.reduce
(Python 2 में, reduceयह बिना किसी प्रकार के फंक्शंस से आयात किए बिना वैश्विक नामस्थान में उपलब्ध है।)
import functools
my_str = "Hey, you - what are you doing here!?"
replacements = (',', '-', '!', '?')
my_str = functools.reduce(lambda s, sep: s.replace(sep, ' '), replacements, my_str)
words = my_str.split()