প্রথমত, আমি অন্যের সাথে একমত হতে চাই যে রেজেক্স বা str.translate(...)
ভিত্তিক সমাধানগুলি সর্বাধিক পারফরম্যান্স। আমার ব্যবহারের ক্ষেত্রে এই ফাংশনটির পারফরম্যান্স তাত্পর্যপূর্ণ ছিল না, তাই আমি সেই মানদণ্ডগুলির সাথে বিবেচনা করে এমন ধারণাগুলি যুক্ত করতে চেয়েছিলাম।
আমার মূল লক্ষ্যটি ছিল অন্য কয়েকটি উত্তর থেকে ধারণাগুলিকে সাধারণ সমাধান করা যা কেবলমাত্র রেগেক্স শব্দের চেয়ে বেশি স্ট্রিংগুলির জন্য কাজ করতে পারে (অর্থাত্, বিরামচিহ্ন অক্ষর বনাম শ্বেত তালিকাভুক্ত শব্দের অক্ষরের সুস্পষ্ট উপসেটকে কালো তালিকাভুক্ত করা)।
মনে রাখবেন যে, যে কোনও পদ্ধতির ক্ষেত্রে, string.punctuation
একটি নিজে নিজেই সংজ্ঞায়িত তালিকার জায়গায় ব্যবহার বিবেচনা করতে পারেন ।
বিকল্প 1 - 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
এটি আরও কয়েকটি লাইন, তবে আপনাকে রেগেক্সে কোনও নির্দিষ্ট চরিত্রের হাত থেকে বাঁচতে হবে কিনা তা পরীক্ষা না করেই প্রসারিত হওয়ার সুবিধা রয়েছে।
my_str = "Hey, you - what are you doing here!?"
replacements = (',', '-', '!', '?')
for r in replacements:
my_str = my_str.replace(r, ' ')
words = my_str.split()
পরিবর্তে স্ট্রিংয়ের স্ট্রিংরেজকে মানচিত্র তৈরি করতে পেরে ভাল লাগত, তবে আমি মনে করি না যে এটি অপরিবর্তনীয় স্ট্রিং দিয়ে করা সম্ভব হবে এবং অক্ষরের তালিকার বিরুদ্ধে ম্যাপিংয়ের সময় প্রতিটি চরিত্রের বিপরীতে প্রতিস্থাপন চালানো হবে অতিরিক্ত শব্দ। (সম্পাদনা করুন: কার্যকরী উদাহরণের জন্য পরবর্তী বিকল্পটি দেখুন))
বিকল্প 3 - functools.reduce
(পাইথন 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()