2016-02-17 3 views
5

Für jedes Zielwort möchte ich prüfen, ob die nächsten Wörter, die vor dem nächsten Zielwort erscheinen, dem entsprechen, was ich in einem Dokument eingestellt habe. Wenn Übereinstimmung, möchte ich es auf True ausgeben und in txt-Datei schreiben. Wenn falsch, schreibe falsch aus.python match Zielwort

ich regex bin mit, aber Iteration Art und Weise ist in Ordnung

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

Ziel und nächsten Worte:

target word: document 
next words: set is complete 

Probe Doc:

Dokument, das ich Satz komplett ist jetzt . Das Dokument ist großartig. Ist Dokument ist groß, komplette Dokument ist abgeschlossen. Dokument ist vollständiges Dokument ist gut, aber nicht vollständig.

Dokument erscheint 6 Mal in diesem Auszug, aber ich will es zurück und Ausgang die unten an txt-Datei

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

Antwort

0

keine regulären Ausdrücke für diese Aufgabe verwenden Sie stattdessen String Spleißen wird genügen. Ein Beispiel für eine einfache Art und Weise:

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") 

Wir teilten den Text auf jedem Wort, das wir zu finden sind versucht, es auf eine Liste zu senden. Wir durchlaufen diese Liste und wenn die wichtigen Wörter gefunden sind, geben wir true aus, oder wenn nicht, geben wir false aus.

+0

@GarrettR Das ist ärgerlich. Ich habe mir nur die Wörter ausgedacht und viele von ihnen waren wirklich sehr nutzlos. Ich habe aktualisiert, um mehr logische Variablennamen zu verwenden. (Sowohl die alten als auch die neuen Versionen funktionieren auf meinem Python, also sag mir, ob diese Version auch nicht funktioniert). –

0

Eine Lösung mit regex mit Wortgrenzen, um sicherzustellen, dass Worte sind nicht Teil von anderen Wörtern (pre gesetzt, jetzt adays, Dokument ary):

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) 

Offensichtlich, wenn target und nextwords beginnen und enden mit Nicht-Wort-Zeichen, müssen Sie Wortgrenzen durch Lookarounds ersetzen.

0

Sie können die Sterne Index aller Vorkommen von document ‚s und End-Index set is complete‘ s mit start und end Attribute der abgeglichenen Objekte verwenden. Ermitteln Sie die erwarteten Übereinstimmungen, indem Sie prüfen, ob der letzte Index des nächsten Worts zwischen einem der fortlaufenden Paare der document s liegt.

>>> 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]