নিয়মিত এক্সপ্রেশন: তালিকায় অনুসন্ধান করুন


91

আমি নিয়মিত অভিব্যক্তির ভিত্তিতে একটি তালিকায় স্ট্রিং ফিল্টার করতে চাই।

এর চেয়ে ভাল কিছু আছে কি [x for x in list if r.match(x)]?

উত্তর:


116

আপনি একটি তৈরি করতে পারেন পুনরুক্তিকারীর পাইথন 3.x বা তালিকা ব্যবহার করে পাইথন 2.x মধ্যে:

filter(r.match, list)

পাইথন ৩.x পুনরুক্তিকে একটি তালিকায় রূপান্তর করতে , কেবল এটিকে কাস্ট করুন; list(filter(..))


4
প্রকৃতপক্ষে, তালিকা বোধগম্য সাধারণত ফিল্টার, হ্রাস, ল্যাম্বডা ইত্যাদির মতো কার্যকরী কাঠামোর চেয়ে বেশি পছন্দ করা হয়
Ivo van der Wijk

39
@ আইভো: এগুলি সাধারণত পছন্দ হয় কারণ এগুলি সাধারণত পরিষ্কার এবং প্রায়শই অধিক সংঘাতযুক্ত। তবে এই ক্ষেত্রে, filterসংস্করণটি পুরোপুরি পরিষ্কার এবং এর শব্দ কম রয়েছে।
sepp2k

9
r.matchএখানে কি ?
rbatt

4
@ আরব্যাট r.matchএকটি পদ্ধতি যা প্রদত্ত স্ট্রিংয়ের সাথে প্রয়োগ করা হলে, রেইগেক্স rসেই স্ট্রিংয়ের সাথে মেলে কিনা (এবং যদি এর সাথে সম্পর্কিত কোনও ম্যাচ অবজেক্ট ফিরিয়ে দেয় তবে ফলাফলটি সত্যবাদী কিনা তা কেবল আমাদের যত্নশীল বলে এই ক্ষেত্রে কিছু যায় আসে না)
sepp2k

174

পূর্ণ উদাহরণ (পাইথন 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 (যাতে এটা চমত্কারভাবে আউট মুদ্রিত দেখার জন্য)।

পাইথন 3 কোড উদাহরণ
পাইথন 2.x কোড উদাহরণ


4
হাই, আমি যখন উপরের কোডটি চালাচ্ছি তখন আমি <filter object at 0x1057acda0>কী ভুল করছি?

4
পাইথন ডক্স অনুসারে (পাইথন ২.7.১২): ডকস.পাইথন.আর. / / লাইব্রেরি / ফাংশনস html# ফিল্টার ফিল্টার একটি বস্তু নয় একটি তালিকা প্রদান করে returns আপনি সেই কোডটিও দেখতে পারেন: repl.it/X3G/5786 (কেবল রান করুন)
বুধ

4
ধন্যবাদ. আমি ম্যাকে পাইথন 3.5.3 ব্যবহার করছি। আমি আপনার লিঙ্ক চেষ্টা করেছিলাম। অবশ্যই এটি কাজ করে, যদিও আমি নিশ্চিত না যে আমি কেন এই চিত্রটি পাই। এমনকি আমি strযেহেতু filterকোনও উপকারের জন্য কোনও তালিকা ফেরত

4
@ জোশুয়া আপনি সম্ভবত এটি এখনই খুঁজে পেয়েছেন তবে চেষ্টা করুন print(list(newlist))বাprint([i for i in newlist])
জেমস ড্রাগার

4
এটি হাস্যকরভাবে কঠিন। আর এ কারণেই আর উচ্চতর। কেবল গ্রেপ (প্যাটার্ন, ভেক্টর_ম_নাম)
ম্যাডম্যান লাই

1

প্রথমে রেজেক্সকে সংকলন না করে এটি করার জন্য একটি 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প্রথম যুক্তি হিসাবে কেবল গ্রহণ করে এবং সেই তালিকাটি ফিরে আসে যেখানে সেই কলযোগ্য একটি 'সত্যবাদী' মান ফেরত দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.