Seite 1 von 1

Zugriff auf regex-type

Verfasst: Samstag 28. Januar 2012, 21:16
von Lilo-Mausi
Hallo,

Ich bin eine Biologiestudentin und hab mich diese Semester sehr viel mit Programmieren beschäftigt, weil ich das für meine Ökologie-Diplomarbeit brauche.

Und jetzt hab ich an euch Junx hier die Frage, ob ich einen regex-typ umwandeln kann bzw. wie ich Zugriff darauf bekomme.
Also ich bekomm z.B.: nach einem Suchvorgang eine Liste als Ergebnis mit meinen gesuchten "matches". Und wenn ich jetzt abfrage, was das für ein Typ ist, steht: "Nonetype".
Und ich möchte ja schließlich wissen wie viele Suchergebnisse meine Suche erzielt hat.

Bitte, bitte helft mir. Bin schon sooooo verzweifelt.
Vielen Dank schon im Voraus!

Bussi
Eure Lilo

Re: Zugriff auf regex-type

Verfasst: Samstag 28. Januar 2012, 21:26
von nomnom
Hallo Lilo,
das Ergebnis der Suche sollte auf jeden Fall nicht `NoneType` sein. Wir wissen leider nicht, wie du denn deine Liste an Suchergebnissen erhältst und können dir deshalb bis jetzt keine sehr große Hilfe sein. Kannst du uns bitte darüber aufklären?
Hier allerdings trotzdem ein kleines Beispiel, wie man Regular Expressions in Python benutzt:

Code: Alles auswählen

import re

TEXT = "a = 1; b = 2;"
print ', '.join(re.findall(r'\D\w*\s*=\s*(\d+);', TEXT))
Viele Grüße
Edit: Das ist vielleicht auch ganz interessant:

Code: Alles auswählen

'; '.join(map(' = '.join, re.findall(r'(\D\w*)\s*=\s*(\d+);', 'a=1; b=2;')))

Re: Zugriff auf regex-type

Verfasst: Samstag 28. Januar 2012, 21:36
von webspider
Ich würde dir vorschlagen du probierst an einem so kleinem Suchtext wie möglich aus inwieweit der von dir gewählte Regex auch funktioniert. Sollte das nicht das Problem sein, wird der Fehler an deinem Quellcode liegen.

Re: Zugriff auf regex-type

Verfasst: Samstag 28. Januar 2012, 21:48
von Lilo-Mausi
Hey Junx,
Vielen Dank für die rasche Antwort, Nomnom und Webspider!

Okay, also was hab ich gemacht:
Zuerst eine Such-Funktion definiert:

def Find_Tiere(pat, text):
match=re.findall(pat, text, re.IGNORECASE)
if match: print match
else: print "not found"

Dann hab ich über "raw_input" die jeweiligen Parameter für "pat" und "text" definiert, also was ich wo suchen will.
Und ich erhalte eine Liste mit den Ergebnissen... Also sowas: [Affe, affe]
Und dann will ich die Ergebnisse zählen lassen, also z.B.: hier: Ergebniss = 2!
Nur irgendwie kann ich auf die Liste nicht zugreifen.

Eure Lilo

Re: Zugriff auf regex-type

Verfasst: Samstag 28. Januar 2012, 21:55
von nomnom
So sollte es gehen:

Code: Alles auswählen

import re

def finde_tiere(pattern, text):
    matches = re.findall(pattern, text, re.I) # re.I ist dasselbe wie re.IGNORECASE
    print ', '.join(matches) or 'Keine Tiere gefunden'
    print 'Es wurden {} Tiere gefunden.'.format(len(matches))

if __name__ == '__main__':
    tiertext = 'Der Affe kann gut klettern, der Fisch gut schwimmen.'
    finde_tiere('(Affe|Fisch)', tiertext)
    print
    finde_tiere('(Fuchs|Dachs)', tiertext)
Wie hast du es denn versucht?

Re: Zugriff auf regex-type

Verfasst: Sonntag 29. Januar 2012, 14:33
von Lilo-Mausi
Okay Danke dir! :D

Hast mir sehr geholfen.
Also ich hab es jetzt so gemacht, wie du mir gerate hast und es funktioniert super!
Und wenn ich mir jetzt angeben lassen will, was alles falsch ist in meiner Suche, also die Anzahl der falschen Buchstaben, wollte ich einfach von der Text-Länge die Pat-Länge abziehen und das geht auch super.

Also so:
print "{} Fehler!" .format(len(text)-len(matches))

Und jetzt hab ich noch eine "Fehler" Funktionsvariable definiert, und diese brauch ich damit meine Suchfunktion nur bis z.B.: einer Anzahl von 2 Fehlern sucht.
Wenn ich jetzt aber sage:
if Fehler < (len(text)-len(matches)):
text[mismatches:] #um meine Text zu verkürzen
...dann funktioniert das aber irgendwie nicht. :cry:

Wär echt nett, wenn du mir nochmal helfen könntest.

Liebe, liebe Grüße
Eure Lilo

Re: Zugriff auf regex-type

Verfasst: Sonntag 29. Januar 2012, 16:27
von nomnom
`len(matches)` ist ja auch die Anzahl der Treffer, und nicht die Anzahl der Buchstaben der Treffer. Da müsstest du mit `len(' '.join(matches))` die Treffer aneinanderreihen und die Buchstaben zählen. Außerdem ist es eher `text[:mismatches]`, da du ja den Text von Anfang bis zum zweiten Fehler brauchst.