2016-02-17 19 views
5

Per ciascuna parola di destinazione, voglio verificare se le parole successive che appaiono prima della prossima parola target corrispondono a ciò che ho impostato in un documento. Se corrisponde, voglio che venga stampato su true e scriva nel file txt. Se falso, scrivi falso.corrispondenza obiettivo parola python

sto usando espressioni regolari, ma l'iterazione i casi è bene

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

Target e successive parole:

target word: document 
next words: set is complete 

Esempio Doc:

documento che insieme è completa ora . Il documento è un ottimo set. Il documento è un ottimo set di documenti completo. Il documento è il documento completo è buono ma non completo.

documento appare 6 volte in questo estratto, ma voglio che ritorni e l'uscita il sottostante per file txt

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

risposta

0

Non usare le espressioni regolari per questo compito, invece, stringa di splicing sarà sufficiente. Un esempio di un modo semplice:

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

Abbiamo diviso il testo su ogni parola che stiamo cercando di trovare, inviarlo a un elenco. Effettuiamo iterazioni su questo elenco e se vengono trovate le parole importanti, l'output è true o, in caso contrario, viene restituito false.

+0

@GarrettR Questo è sconvolgente. Ho appena inventato le parole e quindi molte di loro erano davvero inutili. Ho aggiornato per utilizzare più nomi di variabili logiche. (Sia la vecchia che la nuova versione funzionano sul mio Python, quindi dimmi se anche questa versione non funziona). –

0

Una soluzione con regex per assicurare con confini di parola che le parole non sono una parte di altre parole (pre impostato, ora adays, documento 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) 

Ovviamente se target e nextwords inizia e termina con caratteri non di parole, è necessario sostituire i limiti di parola con i lookaround.

0

È possibile utilizzare l'indice stelle di tutte le occorrenze di document 's e l'indice fine set is complete' s utilizzando start e end attributi degli oggetti corrispondenti. E ottenere le partite attese controllando se l'ultimo indice della parola successiva è compreso tra una delle coppie continue di document s.

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