2016-02-17 15 views
5

Dla każdego słowa docelowego chcę sprawdzić, czy następne słowa, które pojawiają się przed następnym słowem docelowym, odpowiadają temu, co ustawiłem w dokumencie. Jeśli pasuje, chcę, aby wyprowadzał do wartości true i zapisał do pliku txt. Jeśli jest false, wypisz false.Python match target word

Używam regex, ale iteracja droga jest w porządku

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

docelowa i następne słowa: doc

target word: document 
next words: set is complete 

Próbka:

Dokument że zestaw jest kompletny teraz . Dokument jest świetny. Czy dokument jest świetny kompletny zestaw dokumentów jest kompletny. Dokument to kompletny dokument jest dobry, ale nie kompletny.

dokumentu pojawia się 6 razy w tym fragment, ale chcę wrócić i wyjście poniżej do pliku txt

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

Odpowiedz

0

Nie używać wyrażeń regularnych do tego zadania, zamiast tego będzie ciąg forniru wystarczać. Przykład prostego sposobu:

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

Podzielamy tekst na każde słowo, które próbujemy znaleźć, przesyłając je do listy. Wykonujemy iterację na tej liście i jeśli ważne słowa zostaną znalezione, wyprowadzamy prawdę, a jeśli nie, wyprowadzamy fałsz.

+0

@GarrettR Thats przykreje. Po prostu wymyśliłem te słowa, więc wiele z nich było naprawdę bezużytecznych. Zaktualizowałem, aby używać więcej logicznych nazw zmiennych. (Zarówno stara, jak i nowa wersja działają na moim Pythonie, więc powiedz mi, czy ta wersja również nie działa). –

0

roztwór z regex, aby zapewnić z granicami słowo, że słowa nie są częścią innych wyrazów (pre ustawić, teraz adays, dokumentów 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) 

Oczywiście, jeśli target i nextwords początek i koniec ze znakami innymi niż słowami, należy zastąpić ograniczenia słów ograniczeniami.

0

Można użyć indeks wszystkich wystąpienia document „s oraz indeksem końcowym set is complete” s korzystających start i end atrybuty dopasowanych obiektów gwiazdki. I uzyskaj oczekiwane dopasowania, sprawdzając, czy ostatni indeks następnego słowa znajduje się pomiędzy jedną z par ciągłych s 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]