RE-Suche

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
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

hallo an alle,

ich würde gerne in nem String alle vorkommen eines Teilstrings suchen. Dieser Teilstring muss aber nicht vollkommen bekannt sein. Ich suche also z.B. so etwas:

ACTGTG*ACTT

wenn ich nun mit re.search() suche findet gibt er mir aber leider keine matchobjekte aus. Er findet also nichts obwohl ich mit sicherheit sagen kann das der Teilstring drin vorkommt. Es kann auch sein das ich das RE Modul in Python noch nich wirklich begriffen habe aber müsste mir das hier:

Code: Alles auswählen

    def regexsearch(self, regex):
        genome = Imports.genome
        flist = []
        flist.append(re.search(regex, genome.getSequence() , re.I))
        #print flist
nicht eine liste alle matchobjekte in einer liste verpackt zurück geben?


Gruß Phill
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Der `*` wiederholt den Buchstaben davor beliebig oft. Dein Ausdruck würde z.B. auf `ACTGTGGGGGGGGGGGGACTT` zutreffen. Was du aber wohl suchst, so rate ich, beliebige Zeichen zu wiederholen. Dafür steht `.`. Also: `ACTGTG.*ACTT`. Nun muss man noch wissen, dass `.*` den längstmöglichen String findet. Das kann zu viel sein. Den kürzesten String findet `.*?`.

Stefan
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Und den entscheidenden Teil hast du nicht gepostet: die Eigentliche RE 8) :

Code: Alles auswählen

REGEXPATTERN = r"ACTGTG.*?ACTT"
regex = re.compile( REGEXPATTERN , re.I)# kommen da wirklich Kleinbuchstaben vor?
matches = regex.findall(genome.getSequence())
if matches is None:
    "nichts gefunden"
# ...
hth, Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
BlackJack

@b.esser-wisser: Die Bedingung wird nie war, weil `findall()` nie `None` liefert.

Code: Alles auswählen

In [35]: re.findall('x', 'z')
Out[35]: []
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

das Problem ist das ich den suchstring vorher nicht kenne sondern der erst durch den benutzer eingegeben wird also fällt sowas

Code: Alles auswählen

REGEXPATTERN = r"ACTGTG.*?ACTT"
schonmal weg...

das Problem ist doch das der Benutzer dann den vollständigen Ausdruck also auch mit .*? schon eingeben muss damit die suche eine sinnvolle reg ex suche wird oder nicht?


gruß
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@b.esser-wisser:

Ersetze Zeile 4 mit `if not matches`. Es ist doch eigentlich egal, welche Art von "Nichts" zurückgegeben wird und das klingt auch menschlicher. ;) Und None wird, wie schon gesagt wurde, eh nicht zurückgegeben.
BlackJack

@phill: Wie schwer kann es denn sein aus der Benutzereingabe "ab*c" den regulären Ausdruck "ab.*?c" zu machen!?
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Ja ich geb's zu - der 'is None Test' ist da unangebracht :oops:

@OP: 'Notfalls' kannst du die Regex ja selber bauen (user_input.replace('*', ".*?") oder so).
Aber vielleicht wissen einige User es auch zu schätzen, wenn sie (auch) mittels regex suchen können ("It's not a bug, it's a Feature";).

hth, Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

wenn ich anstatt dem findall das "normale" search benutze, kann ich dann irgendwie die position des matches herausfinden. ich bekomme dann ja so ein match-objekt zurück oder?
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

MatchObject.start() ... das ist aber nicht so schwer rauszufinden :wink:
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Besser spät als nie ...

Zum Thema bauen des Re-Ausdrucks:

Ich hatte mal ein ähnliches Problem und es in etwa so gelöst (Freihandumsetzung - nicht getestet):

Code: Alles auswählen

def create_pattern(input_pattern):
    pattern = [nuc[x] for x in input_pattern.upper()]
    return re.compile(''.join(pattern))
wobei nuc ein dict sein sollte, das etwa so aufgebaut ist:

Code: Alles auswählen

nuc = {'A': 'A', 'C': 'C', 'G': 'G', 'T': 'T', 'X': '[G|C|A|T]', 'M': '[C|A]', ...}
Auf diese Weise lassen sich alle denkbaren Fälle bauen.

HTH
Christian
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

hey ihr, ich bin nochmal...

irgendwie wills nich so wie ich will und ich weiss einfach nich woran es liegt:

Code: Alles auswählen


        regex = re.compile(patterns)#patterns wird vom user eingegeben
        matches = regex.finditer(String)
        regexlist = FeatureList("regex")
            for match in matches:
                feature = Feature("Reg-Ex Hit","Gene Sequence", match.start(),match.end() )
                regexlist.addFeature(feature)

das ganze wirft mir dann den fehler:

File "C:\Python26\Lib\re.py", line 186, in finditer
return _compile(pattern, flags).finditer(string)
File "C:\Python26\Lib\re.py", line 245, in _compile
raise error, v # invalid expression
sre_constants.error: multiple repeat


so also invalid expression aber ich hab kA wieso...

kann mir jemand weiterhelfen?


gruß
problembär

Könnte sein, daß Dich auch das hier interessiert. Bin aber nicht sicher.

Gruß
BlackJack

@phill: Das passiert zum Beispiel wenn das Muster so aussieht: 'x**'. Das ist kein gültiger regulärer Ausdruck. Da das vom Benutzer eingegeben wird, musst Du solche Ausnahmen ordentlich behandeln. Denn Benutzer geben sonst was ein. :-)
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

also liegt es nicht am code sondern an der eingabe??
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

phill hat geschrieben:also liegt es nicht am code sondern an der eingabe??
Ja und nein. Es ist Aufgabe des Codes, ungültige Eingaben abzufangen, was deiner nicht tut :)
Bottle: Micro Web Framework + Development Blog
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

ok aber die funktionalität ist gegeben das wollt ich wissen ;)


vielen dank!
Antworten