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

:
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.
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
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
@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

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!