findall

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
Quicktrader
User
Beiträge: 16
Registriert: Freitag 6. November 2015, 20:24

Hallo..bin ein Newbie :shock: und von Python an sich begeistert..klappt nur leider noch immer nicht ganz.

FRAGE Nr. 1:
Ich möchte einen STRING namens 'chain' generieren, soweit:

alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
A = alphabet[0]
B = alphabet[0]
C = alphabet[0]
D = alphabet[0]
chain = A+B+C+D
print (chain)

Allerdings möchte ich nun auch AAAB, AAAC,...ZZZZ, also alle möglichen Varianten generieren. :mrgreen:

Die Frage: Wie erhöhe ich z.B. D auf alphabet[1]...alphabet[26], weiters dass dieses wieder auf alphabet[0] springt wenn C das erste mal auf alphabet[1] erhöht wird? So dass eben one-after-another alle Kombinationen an 26^4 Buchstabenkombinationen ausgegeben werden?


FRAGE Nr. 2
Jetzt wird's knackig: Ich möchte nun jeden gefundenen string mit einem dictionary.py bzw. .txt abgleichen. Und zwar am besten so, dass ich alle Kombinationen mit mehreren Wörtern ausgespuckt bekomme. In der Praxis ist meine 'chain' tatsächlich 12 Buchstaben lang (manche Buchstaben sind vorgegeben, andere werden durch Fragestellung Nr. 1 ergänzt).

Ein Beispiel:
Der Generator spuckt mehrere strings aus, z.B.:

QMEINXNAMEER
YSEINHAUSTHI
QPIEFJÖALENI
...

Mit dem Dictionary wird nun abgeglichen. Optimales Ergebnis wäre (bei Mindestanzahl Worte: 2)

['MEIN', 'NAME'] ['MEIN', 'MEER']
['SEIN', 'HAUS']
[]

so dass man erkennen kann, welcher synthetisch generierte String nun tatsächlich einen lesbaren Text :idea: beinhaltet (also idealerweise eine Mindestanzahl an Worten berücksichtigt).

Momentan schaffe ich es mit

import re
dict = ['Haus', 'Baum', 'Pflanze']
a = 0
x = re.findall(dict[a], chain)
print (x)

leider nur ein Wort innerhalb eines strings zu finden.

x = re.findall(dictionary.py, chain)

funktioniert leider auch nicht. Gefunden werden sollen dennoch mehrere, also z.B. zumindest zwei Worte. Mit

input = open ('dictionary.py','r')
Z = input.read()
x = re.findall(Z, chain)
print (x)

komme ich leider ebenfalls nicht wirklich weiter. Das ganze ist zum Entschlüsseln einer klassischen Chiffre (z.B. Edward Elgar) gedacht.

Danke für Eure Ideen, eine Lösung die mir das ganze so ausspuckt, dass man auch noch erkennen kann von welchem String die Ergebnisse kommen, ist mir auf jeden Fall ein Wiener Schnitzel wert..an der Chiffre (nicht Edward Elgar) bin ich im übrigen seit etwa sechs Jahren dran..nun wesentlichen einen Schritt weiter, würde ich gerne das Ergebnis technisch komplettieren (Excel funktioniert für diese Methode, aber viel zu langsam :( ).

Quicktrader
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Zu Frage 1: Googel mal nach itertools.product
Und Frage 2 versteh ich nicht.
PS: Die angebotene Summe ist beachtlich.
Quicktrader
User
Beiträge: 16
Registriert: Freitag 6. November 2015, 20:24

Üpsilon hat geschrieben:Zu Frage 1: Googel mal nach itertools.product
Und Frage 2 versteh ich nicht.
Danke für den Tipp mit itertools.product..bzgl. Frage zwei ist im Grunde einfach - wie kann ich einen String dahingehend überprüfen ob mehrere Worte aus einer Dictionary enthalten sind?

Bin für jeden Tip dankbar,

QT
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Code: Alles auswählen

dict = ['Haus', 'Baum', 'Pflanze']
ist gleich in zweierlei Hinsicht schlecht.

1. ist `dict` eine Build-in Funktion von Python, die du so überschreibst
2. ist das so wie so kein Dictionary, sondern eine Liste.

Ob z.B. ein String ein Element einer Liste ist, kann du mittels `in` überprüfen. Wenn du wissen willst, welche Elemente von Liste A in Liste B vorhanden sind, kannst du z.B. über Liste A iterieren und jedes Element so mittels `in` gegen Liste B prüfen
Excel funktioniert für diese Methode, aber viel zu langsam
Brute-Force Attacken sind nun mal zeitaufwendig bzw. rechen(zeit)intensiv. Das ist bei Python nicht viel anders.

Gruß, noisefloor
Antworten