Exakte Suche nach Wort mit "in" Command möglich?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lordzwieback
User
Beiträge: 55
Registriert: Montag 2. März 2015, 14:35
Kontaktdaten:

Hallo,

vorweg möchte ich mich entschuldigen, wenn diese Frage schon beantwortet wurde, konnte aber nach einer Forumsuche nichts passendes finden.

Ich lese in einem Script eine Textdatei Zeile für Zeile ein. Bei jeder Zeile wird geprüft, ob bestimmte Wörter darin vorkommen. Das funktioniert auch alles einwandfrei. Nur habe ich jetzt das Problem, dass die Suche per if xyz in string wohl nicht exakt arbeitet. Soll heißen wenn ich nach "Haus" suche und im zu durchsuchenden String "Haustür" steht, bekomme ich falsche Ergebnisse.

Nun zur eigentlichen Frage: Kann ich mit dem "in"-Command per Flag oder etwas Ähnlichem sagen, dass er exakt suchen soll oder muss ich mein Script umschreiben auf reguläre expressions, um eine exakte Suche zu bekommen?

Grüße
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist exakt. Der Computer kennt keinen semantischen Unterschied zwischen Leerzeichen und Buchstaben - das ist fuer ihn alles eine Zahl, und du fragst, ob eine Reihe von Zahlen hintereinander vorkommen.

Wenn du das anders haben willst, musst du dein Problem anders beschreiben. ZB kannst du mit "der satz mit haus".split() eine Liste erzeugen, in der dann das Wort "haus" ein einzelnes Element darstellt. Darauf mit "in" zu suchen liefert dann ein besseres Ergebnis im Sinne deines Zieles.
lordzwieback
User
Beiträge: 55
Registriert: Montag 2. März 2015, 14:35
Kontaktdaten:

Hi, danke für deine Antwort. Das Verfahren mit Split mache ich schon so. in dem bestimmten Fall steht in index[1] z.B. "HSchmitt" und bei einem nächsten Durchlauf kann es sein, dass in diesem Index nur "Schmitt" steht. Bei beiden Durchläufen springt er in den jeweiligen Code unter der if-Abfrage.

Beispiel (in context steht der Inhalt des Textfiles):

Code: Alles auswählen

content = f.read().split("\n")
for i in range(len(content)):
    if user in content[i]:
    	xyz = True
    else:
    	xyz = False
So habe ich es momentan (Code vereinfacht). Nur erhalte ich hier eben falsche Werte zurück, wenn z.B. 1x Schmitt als User und einmal HSchmitt als User in der Zeile steht. Aber wenn es nicht anders funktioniert, muss ich es eben auf regex umschreiben. Da habe ich in einem kleinen Beispielscript schon durchgetestet, ob es funktioniert:

Code: Alles auswählen

import re

x = "hallo welt HSchmitt"
searchWord = "Schmitt"
count = re.findall('\\b' + searchWord + '\\b', x, flags=re.IGNORECASE)

if len(count) > 0:
    print("Wort ist in String")
else:
    print("Wort ist nicht in String")
Hier kann ich nach dem EXAKTEN Suchwort suchen in einem gegebenen String und erhalte (je nach Suchwort) auch die richtige Ausgabe.

EDIT: Ich glaube, ich habe deine Antwort falsch verstanden. Werde mich gleich nochmal melden.
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte nicht mit

Code: Alles auswählen

for i in range(len(liste)):
     zeile = liste[i]
arbeiten. Das geht *so* viel einfacher und idiomatischer mit einem simplen

Code: Alles auswählen

for zeile in liste:
Und in deinem Fall kannst du dir auch das einlesen sparen:

Code: Alles auswählen

with open("dateiname") as inf:
     for line in inf:
iteriert schon ueber die Zeilen.

und auch das dicke if ist unnoetig, ein simples

Code: Alles auswählen

xyz = user in zeile
reicht voellig. Last but not least: das split gehoert zur Zeile.

Du kannst natuerlich auch das ganze einfach mit einer Zeile loesen:

Code: Alles auswählen

with open("dateiname") as inf:
    xyz = user in inf.read().split()
lordzwieback
User
Beiträge: 55
Registriert: Montag 2. März 2015, 14:35
Kontaktdaten:

Wow, vielen Dank für die vielen Hilfestellungen, werde mir das mal alles anschauen.
Antworten