2011-12-30 14 views
5

साथ खोज करते समय मुझे समारोह है कि सूचियों की एक सूची में एक स्ट्रिंग खोज तो मिलान सूचियों वाले एक सूची लौटाती है:अजगर उन्नत स्ट्रिंग ऑपरेटरों और बूलियन

def foo(myList,keyword,first=True): 
    if first: #Search only first element or each sublist 
     return [x for x in myList if keyword in x] 
    else: #Search first and second elements of each sublist 
     return [x for x in myList if keyword in x or keyword in x[1]] 

अब मैं इसे उन्नत खोज को संभालने के लिए विस्तार करना चाहते

matchthis -butnothis -"and not this" 

this|orthis|"or this" 

brand new*laptop # this is a wildcard, matches like: brand new dell laptop 

"exact phrase" 

वहाँ किसी भी अजगर मॉड्यूल (अधिमानतः निर्मित) कर रहे हैं कि मैं अपने समारोह में उपयोग कर सकते हैं इन प्रश्नों को संभालने के लिए: जैसे प्रश्नों के साथ?

पीएस: मुझे सुवोश के बारे में पता है लेकिन इस समय मेरे लिए यह सही नहीं है। इसके अलावा, मैं वर्तमान में ऐप इंजन का उपयोग कर रहा हूं।

जो मैं मूल रूप से करने की कोशिश कर रहा हूं वह स्मृति में पूर्ण-पाठ खोज है, क्योंकि ऐप इंजन अभी तक पूर्ण-पाठ खोज का समर्थन नहीं करता है। मैं डेटास्टोर से पूछता हूं, क्वेरी मैचों को खोजने के लिए उन सूचियों के माध्यम से इकाइयों को सूचियों और लूप में डालता हूं।

उत्तर

4

मैं खोज क्वेरी के प्रत्येक भाग के लिए रेगेक्स बनाने का प्रयास करूंगा। सबसे पहले आप shlex.split() का उपयोग कर भागों में क्वेरी को तोड़ सकते हैं, और फिर प्रत्येक रेगेक्स को व्यक्तिगत रूप से बना सकते हैं।

import shlex, re 

def foo(query): 
    pieces = shlex.split(query) 
    include, exclude = [], [] 
    for piece in pieces: 
     if piece.startswith('-'): 
      exclude.append(re.compile(piece[1:])) 
     else: 
      include.append(re.compile(piece)) 
    def validator(s): 
     return (all(r.search(s) for r in include) and 
       not any(r.search(s) for r in exclude)) 
    return validator 

इस उदाहरण के लिए, एक समारोह है कि आप क्वेरी के खिलाफ मान्य करने के लिए उपयोग कर सकते हैं वापस आ जाएगी:

>>> test = foo('matchthis -butnothis -"and not this"') 
>>> test("we should matchthis...") 
True 
>>> test("some stuff matchthis blah and not this...") 
False 

आप कुछ वाइल्डकार्ड से निपटने में जोड़ने के लिए सक्षम होना चाहिए यहाँ यह पर मेरे दरार है regex में .* के साथ क्वेरी में * को प्रतिस्थापित करें।

+0

यह बहुत ही आशाजनक लग रहा है, मुझे इसे आज़माएं। – ofko

+0

यह पूर्णता है! धन्यवाद। – ofko

2

कोई भी मानक लाइब्रेरी मॉड्यूल नहीं है जो आप चाहते हैं; हालांकि, आप shlex module के साथ शुरू खोज समूहों पार्स करने के लिए कर सकते हैं:

>>> import shlex 
>>> s = '''matchthis -butnothis -"and not this" 
this|orthis|"or this" 
brand new*laptop 
"exact phrase" 
''' 
>>> shlex.split(s) 
['matchthis', '-butnothis', '-and not this', 'this|orthis|or this', 'brand', 'new*laptop', 'exact phrase'] 

तुम भी re module मामले में देख सकते हैं आप पार्स पर बेहतर नियंत्रण के जरूरत है।

+0

मैंने रेगेक्स का उपयोग करने के बारे में सोचा है, लेकिन मुझे लगता है कि यह प्रत्येक पाठ को अनुच्छेद या दो के साथ 1000 लंबे समय तक सूची के लिए बहुत धीमा होगा। – ofko

+0

यदि आप रेगेक्स को प्रीकंपाइल करते हैं, तो वे किसी भी अन्य शुद्ध पायथन तकनीक के साथ हराकर बहुत तेज़ और कठिन हो सकते हैं। –

संबंधित मुद्दे