আমি নিয়মিত অভিব্যক্তির ভিত্তিতে একটি তালিকায় স্ট্রিং ফিল্টার করতে চাই।
এর চেয়ে ভাল কিছু আছে কি [x for x in list if r.match(x)]?
উত্তর:
আপনি একটি তৈরি করতে পারেন পুনরুক্তিকারীর পাইথন 3.x বা তালিকা ব্যবহার করে পাইথন 2.x মধ্যে:
filter(r.match, list)
পাইথন ৩.x পুনরুক্তিকে একটি তালিকায় রূপান্তর করতে , কেবল এটিকে কাস্ট করুন; list(filter(..))।
filterসংস্করণটি পুরোপুরি পরিষ্কার এবং এর শব্দ কম রয়েছে।
r.matchএখানে কি ?
r.matchএকটি পদ্ধতি যা প্রদত্ত স্ট্রিংয়ের সাথে প্রয়োগ করা হলে, রেইগেক্স rসেই স্ট্রিংয়ের সাথে মেলে কিনা (এবং যদি এর সাথে সম্পর্কিত কোনও ম্যাচ অবজেক্ট ফিরিয়ে দেয় তবে ফলাফলটি সত্যবাদী কিনা তা কেবল আমাদের যত্নশীল বলে এই ক্ষেত্রে কিছু যায় আসে না)
পূর্ণ উদাহরণ (পাইথন 3):
পাইথন ২.x জন্য নীচের নোটটি দেখুন
import re
mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
r = re.compile(".*cat")
newlist = list(filter(r.match, mylist)) # Read Note
print(newlist)
মুদ্রণ:
['cat', 'wildcat', 'thundercat']
বিঃদ্রঃ:
পাইথন 2.x বিকাশকারীদের জন্য, filterইতিমধ্যে একটি তালিকা ফেরত দেয়। ইন পাইথন 3.xfilter তাই এটি রূপান্তরিত করা হয়েছে কোনো ইটারেটরে ফিরতে পরিবর্তন করা হয়েছেlist (যাতে এটা চমত্কারভাবে আউট মুদ্রিত দেখার জন্য)।
strযেহেতু filterকোনও উপকারের জন্য কোনও তালিকা ফেরত
print(list(newlist))বাprint([i for i in newlist])
প্রথমে রেজেক্সকে সংকলন না করে এটি করার জন্য একটি lambdaফাংশন ব্যবহার করুন - উদাহরণস্বরূপ:
from re import match
values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^\d+$', v), values))
print(filtered_values)
রিটার্নস:
['123', '234']
filter()এটি callableপ্রথম যুক্তি হিসাবে কেবল গ্রহণ করে এবং সেই তালিকাটি ফিরে আসে যেখানে সেই কলযোগ্য একটি 'সত্যবাদী' মান ফেরত দেয়।