2016-02-17 8 views
5

प्रत्येक लक्ष्य शब्द के लिए, मैं यह जांचना चाहता हूं कि अगले लक्ष्य शब्द से पहले दिखाई देने वाले अगले शब्द किसी दस्तावेज़ में सेट किए गए अनुसार हैं या नहीं। यदि मैच है, तो मैं इसे सत्य आउटपुट करना चाहता हूं और txt फ़ाइल को लिखना चाहता हूं। यदि झूठा है, तो झूठी लिखो।पायथन मैच लक्ष्य शब्द

मैं regex का उपयोग कर रहा है, लेकिन यात्रा जिस तरह से ठीक है

import re 
re.findall("([a-zA-Z]+) " + tofind, txt) 

लक्ष्य और अगले शब्द:

target word: document 
next words: set is complete 

नमूना डॉक्टर:

दस्तावेज़ है कि मैं सेट अब पूरा हो गया है । दस्तावेज़ महान सेट है। दस्तावेज़ बहुत अच्छा दस्तावेज़ सेट पूर्ण है। दस्तावेज़ पूर्ण दस्तावेज़ अच्छा है लेकिन पूरा नहीं हुआ है।

दस्तावेज़ इस अंश में 6 बार प्रकट होता है, लेकिन मैं इसे वापस करने और उत्पादन नीचे txt फ़ाइल के लिए करना चाहते हैं

first document -> true 
second document -> false 
third document -> false 
fourth document -> true 
fifth document -> false 
sixth document -> false 

उत्तर

0

इस कार्य के लिए रेगुलर एक्सप्रेशन का उपयोग न करें, बल्कि, स्ट्रिंग स्प्लिसिंग होगा पर्याप्त। एक साधारण तरीके का एक उदाहरण:

sampleDoc = "Document that I set is complete now. Document is great set. Is document is great complete document set is complete. Document is complete document is good but not complete.".lower() 
findWord = "document".lower() 
wordToFind = "set is complete".lower() 
splitList = sampleDoc.split(findWord) 
splitList.pop(0) 
for position,phrase in enumerate(splitList): 
    if wordToFind in phrase: 
     print("Document Number", str(position+1), "-> true") 
    else: 
     print("Document Number", str(position+1), "-> false") 

हम प्रत्येक शब्द पर पाठ को विभाजित करते हैं जिसे हम ढूंढने की कोशिश कर रहे हैं, इसे एक सूची में भेज रहे हैं। हम इस सूची में पुन: प्रयास करते हैं और यदि महत्वपूर्ण शब्द पाए जाते हैं, तो हम सही आउटपुट करते हैं, या यदि नहीं, तो हम झूठी आउटपुट करते हैं।

+0

@ गारेट्रेट परेशान परेशानियां। मैंने अभी शब्दों को बनाया है और इसलिए उनमें से बहुत वास्तव में वास्तव में बेकार थे। मैंने अधिक तार्किक चर नामों का उपयोग करने के लिए अद्यतन किया है। (पुराने और नए संस्करण दोनों मेरे पायथन पर काम करते हैं, इसलिए मुझे बताएं कि यह संस्करण भी काम नहीं करता है)। –

0

शब्द सीमाओं के साथ यह सुनिश्चित करें कि शब्द दूसरे शब्दों का एक हिस्सा (पूर्व अब सेट, adays, दस्तावेज़ ary) नहीं हैं regex के साथ एक समाधान:

import re 

text='Document that I set is complete now. Document is great set. Is document is great complete document set is complete. Document is complete document is good but not complete.' 

target='document' 
nextwords='set is complete' 

spat = re.compile(r'\b{}\b'.format(re.escape(target)), re.I) 
mpat = re.compile(r'\b{}\b'.format(re.escape(nextwords)), re.I) 

result = [True if (mpat.search(x)) else False for x in spat.split(text)[1:]] 
print(result) 
जाहिर है अगर target

और nextwords गैर-शब्द वर्णों के साथ प्रारंभ और अंत, आपको शब्द-सीमाओं को लुकराउंड के साथ प्रतिस्थापित करने की आवश्यकता है।

0

आप document के सभी घटना की और set is complete के अंत सूचकांक 'मिलान वस्तुओं की start और end विशेषताओं का उपयोग रों के सितारों इंडेक्स का उपयोग कर सकते हैं। और अपेक्षित मैचों को जांचकर प्राप्त करें कि अगले शब्द की अंतिम अनुक्रमणिका document एस के निरंतर जोड़े में से एक के बीच है या नहीं।

>>> all_targets_start = [g.start() for g in re.finditer(r'document', s, re.I)] 
>>> all_nextw_end = [g.end() for g in re.finditer(r'set is complete', s, re.I)] 
>>> 
>>> [True if any(i<k<j for k in all_nextw_end) else False for i,j in zip(all_targets_start, all_targets_start[1:])] 
[True, False, False, True, False] 
संबंधित मुद्दे