2017-07-23 1 views
1

Ich bin neu in Python (mit Python3.6). Ich möchte eine 1 erhalten, wenn eine oder mehrere Zeichenfolgen in einer TXT-Datei gelesen werden. Insbesondere habe ich die "read.txt" -Datei, von der ich eine 1 in meiner neuen Liste "Ausnahmen" erhalten möchte, wenn 1 oder mehr Zeichenfolgen in dieser Datei erfüllt sind. Ich habe den folgenden Code:python3 reguläre Ausdrücke auf der Suche nach 1 oder mehr Zeichenfolgen

string1 = 'first sentence I want to check it exists in the read.txt file' 
string2 = 'another sentence I want to check it exists in the read.txt file' 
exemptions = [] 

with open('read.txt') as f: 
    line2 = f.read() # read the txt file 
    wantedstring = re.findall(string1 | string2, line2) # find string1 or string2 in line2 
    if len(wantedstring) > 0: # if either string1 or string2 appears 
     exemptions.append(1) # append a 1 to "exemptions" 
    else: 
     exemptions.append(0) # otherwise a 0 
print(exemptions) 

Allerdings scheint es die re.findall (string1 | string2) Code funktioniert nicht (Typeerror: nicht unterstützte Operandtyp (e) für |: 'str' und 'str') . Ich habe auch versucht "re.findall (string1 oder string2, line2)" aber immer noch nicht funktioniert. Meine gewünschte Ausgabe wäre a [1], wenn eine der beiden Zeichenfolgen in der Datei vorhanden ist, und andernfalls [0].

Vielen Dank im Voraus!

+0

Was Sie wirklich wollen, ist eine Suche mit aho-corasick, z.B. mit [https://pypi.python.org/pypi/pyahocorasick/1.0.0](this). – user2722968

+0

@ user2722968 Wahrscheinlich ein guter Vorschlag, aber der Link funktioniert nicht, es scheint auch, es gibt eine neuere Version – Gribouillis

Antwort

0

Sie können versuchen, entkommen, indem sie zu ersetzen:

wantedstring = re.findall(string1 | string2, line2) # find string1 or string2 in line2 

To (| durch +'|'+ ersetzt wird):

wantedstring = re.findall(string1 + '|' + string2, line2) # find string1 or string2 in line2 
+1

Wunderbar! Vielen Dank! – martins

+0

Die Zeichenfolgen müssen mit 're.escape()' maskiert werden, damit sie funktionieren, wenn sie Sonderzeichen für reguläre Ausdrücke enthalten. – Gribouillis

+0

Ich bin mir nicht sicher, ob ich dir Gribouillis folge. Ich habe versucht, einen string1 zu setzen, der keinem String in der txt-Datei (d. H. String1 = 'asdasdasdasd') und einem string2, der übereinstimmt, entspricht. Die Ausgabe war immer noch [1] wie ich wollte. Wenn beide Zeichenfolgen übereinstimmen, ist die Ausgabe immer noch a [1]. Danke noch einmal. – martins

1

Sie benötigen regulären Ausdruck der Sonderzeichen wie . und Verwendung String-Verkettung

re.findall(re.escape(string1)+ "|"+re.escape(string2), line2) 
+0

Danke Gribouillis. Das hat auch funktioniert, aber ich bevorzuge Open-Source-Lösung für die Einfachheit. Nochmals vielen Dank! – martins

+0

Es ist einfacher, aber es funktioniert nicht. Zum Beispiel meldet es eine Übereinstimmung für den Satz 'erster Satz, den ich überprüfen möchte, dass es in der readZtxt Datei existiert' – Gribouillis