Zugriff auf regex-type

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
Lilo-Mausi
User
Beiträge: 3
Registriert: Samstag 28. Januar 2012, 21:07

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


________________________________
---------------------------------------------
Love begins with a smile, goes by a kiss
and ends with tears in your eyes!
---------------------------------------------
================================
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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;')))
Zuletzt geändert von nomnom am Samstag 28. Januar 2012, 21:41, insgesamt 1-mal geändert.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

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.
Lilo-Mausi
User
Beiträge: 3
Registriert: Samstag 28. Januar 2012, 21:07

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


________________________________
---------------------------------------------
Love begins with a smile, goes by a kiss
and ends with tears in your eyes!
---------------------------------------------
================================
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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?
Lilo-Mausi
User
Beiträge: 3
Registriert: Samstag 28. Januar 2012, 21:07

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


________________________________
---------------------------------------------
Love begins with a smile, goes by a kiss
and ends with tears in your eyes!
---------------------------------------------
================================
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

`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.
Antworten