Seite 1 von 1

RE-Suche

Verfasst: Sonntag 5. Juli 2009, 09:30
von phill
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

Verfasst: Sonntag 5. Juli 2009, 09:56
von sma
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

Verfasst: Sonntag 5. Juli 2009, 10:03
von b.esser-wisser
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

Verfasst: Sonntag 5. Juli 2009, 10:56
von 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]: []

Verfasst: Sonntag 5. Juli 2009, 11:31
von phill
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ß

Verfasst: Sonntag 5. Juli 2009, 11:39
von snafu
@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.

Verfasst: Sonntag 5. Juli 2009, 12:12
von BlackJack
@phill: Wie schwer kann es denn sein aus der Benutzereingabe "ab*c" den regulären Ausdruck "ab.*?c" zu machen!?

Verfasst: Sonntag 5. Juli 2009, 12:14
von b.esser-wisser
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

Verfasst: Sonntag 5. Juli 2009, 12:31
von phill
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?

Verfasst: Sonntag 5. Juli 2009, 13:10
von b.esser-wisser
MatchObject.start() ... das ist aber nicht so schwer rauszufinden :wink:

Verfasst: Sonntag 5. Juli 2009, 21:54
von CM
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

Verfasst: Sonntag 12. Juli 2009, 23:26
von phill
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ß

Verfasst: Montag 13. Juli 2009, 00:30
von problembär
Könnte sein, daß Dich auch das hier interessiert. Bin aber nicht sicher.

Gruß

Verfasst: Montag 13. Juli 2009, 06:47
von 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. :-)

Verfasst: Montag 13. Juli 2009, 10:12
von phill
also liegt es nicht am code sondern an der eingabe??

Verfasst: Montag 13. Juli 2009, 10:32
von Defnull
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 :)

Verfasst: Montag 13. Juli 2009, 13:21
von phill
ok aber die funktionalität ist gegeben das wollt ich wissen ;)


vielen dank!