नियमित अभिव्यक्तियाँ: सूची में खोजें


91

मैं नियमित अभिव्यक्ति के आधार पर एक सूची में तार को फ़िल्टर करना चाहता हूं।

क्या इससे बेहतर कुछ है [x for x in list if r.match(x)]?

जवाबों:


116

आप Python 3.x में एक iterator बना सकते हैं या Python 2.x में एक सूची का उपयोग करके कर सकते हैं:

filter(r.match, list)

पायथन 3.x पुनरावृत्ति को एक सूची में बदलने के लिए, बस इसे कास्ट करें; list(filter(..))


2
वास्तव में, सूची समझ को आमतौर पर कार्यात्मक निर्माण जैसे कि फिल्टर, कम, लंबोदर, आदि पर पसंद किया जाता है
Ivo van der Wijk

39
@ इवो: वे आमतौर पर पसंद किए जाते हैं क्योंकि वे आमतौर पर स्पष्ट होते हैं और अक्सर अधिक रसीले होते हैं। हालांकि इस मामले में, filterसंस्करण पूरी तरह से स्पष्ट है और इसमें बहुत कम शोर है।
sepp2k

9
r.matchयहाँ क्या है
rbatt

2
@rbatt r.matchएक विधि है, जो किसी दिए गए स्ट्रिंग पर लागू होती है, यह पता लगाता है कि क्या regex rउस स्ट्रिंग से मेल खाता है (और यदि ऐसा है तो संबंधित मैच ऑब्जेक्ट लौटाता है, लेकिन यह इस मामले में कोई फर्क नहीं पड़ता क्योंकि हम सिर्फ इस बात की परवाह करते हैं कि परिणाम सत्य है)
sepp2k

175

पूर्ण उदाहरण (पायथन 3):
पायथन के लिए 2.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>जो मैं गलत कर रहा हूं?

1
अजगर डॉक्स (python 2.7.12) के अनुसार: docs.python.org/2/library/functions.html#filter फिल्टर एक वस्तु नहीं एक सूची देता है। आप उस कोड को भी देख सकते हैं: repl.it/X3G/5786 (सिर्फ हिट रन)
बुध

1
धन्यवाद। मैं एक पर अजगर 3.5.2 का उपयोग कर रहा हूँ MAC। मैंने आपके लिंक की कोशिश की। बेशक यह काम करता है, हालांकि मुझे यकीन नहीं है कि मुझे यह संदेश क्यों मिला। मैंने भी तब strसे filterएक सूची वापस कर दी है, कोई फायदा नहीं हुआ ...

4
@ जोशुआ आप शायद अब तक इसका पता लगा चुके हैं, लेकिन कोशिश करें print(list(newlist))याprint([i for i in newlist])
जेम्स ड्रेपर

1
यह हास्यास्पद रूप से कठिन है। यही कारण है कि आर बेहतर है। बस grep (पैटर्न, वैक्टर_ऑफ_नम्स)
मैडमैन

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यह पहली दलील के रूप में लेता है , और एक सूची देता है जहां उस कॉल करने योग्य ने एक 'सत्य' मान लौटाया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.