Seite 2 von 2
Verfasst: Mittwoch 24. November 2004, 17:58
von jens
Jep, das geht... Wieso?
Verfasst: Mittwoch 24. November 2004, 18:29
von Milan
Hi. Auch \x01 ist ein beliebiges Zeichen und wird durch den Punkt "." repräsentiert und soll beliebig oft vorkommen. Aus der Docu:
*?, +?, ??
The "*", "+", and "?" qualifiers are all greedy; they match as much text as possible. Sometimes this behaviour isn't desired; if the RE <.*> is matched against '<H1>title</H1>', it will match the entire string, and not just '<H1>'. Adding "?" after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched. Using .*? in the previous expression will match only '<H1>'.
Außerdem ist ein Punkt kein "\n". Das heißt, er sucht bei dir maximal eine Zeile raus, mehr nicht.
Verfasst: Mittwoch 24. November 2004, 18:48
von jens
Das macht es jetzt ein wenige klarer... Somit macht es eigentlich immer Sinn ein "?" zu benutzen...
Nun gut,
re.findall( InfoStr+"(.+?)\x01", RAWdata ) klappt nun auch, es ist sogar besser als die
"([^\x01]+)" Variante...
Denn ich hab festgestellt, das in seltenen Fällen es leider doch kein \x01 gibt:
z.b.: für folgende Windows-Dateien:
C:\windows\twain.dll - (Twain-Source-Manager)
C:\windows\AppPatch\AcLayers.dll - (Windows Compatibility DLL)
mit der Such mittels
"(.+?)\x01" fällt twain.dll schon mal raus... Bei der anderen Datei kommen allerdings fehlerhafte Ergebnisse zurück

Verfasst: Mittwoch 24. November 2004, 19:37
von Milan
Hi. Das würde ich nicht so sehen, denn wie gesagt, sobald ein "\n" vorkommt, versagt deine Variante, wenn du nicht im DOT-ALL modus bist (Da ist der "." auch ein "\n"). Mach lieber das:
Code: Alles auswählen
muster=re.compile(InfoStr+"([^\x01]+)\x01")
#oder bei dir (trotzdem net so gut, non-greedy):
#muster=re.compile(InfoStr+"(.+?)\x01",re.DOTALL)
muster.findall( RAWdata )
Verfasst: Mittwoch 24. November 2004, 19:57
von jens
Milan hat geschrieben:sobald ein "\n" vorkommt, versagt deine Variante
Da hast du eigentlich recht... Allerdings zeigt sich jedoch, das "(.+?)\x01" besser klappt... Zumindest habe ich bisher nichts gegenteilige feststellen können...
Doch ich würde es ehr vorziehen A-Za-z0-9 usw. zu nehmen, also wirklich nur Zeichen die vorkommen dürfen, allerdings funktioniert es leider nicht... Es kommen nie Treffer zu stande bei:
re.findall( InfoStr+"([a-zA-Z0-9_]+)\x01", RAWdata )
Verfasst: Mittwoch 24. November 2004, 20:06
von Dookie
noch nen versuch:
re.findall(InfoStr+"([a-zA-Z0-9_\x00]+)\x01", RAWdata)
oder
re.findall(InfoStr+"([\w\x00]+)\x01", RAWdata)
eventuell, falls auch Leerzeichen und Linefeeds vorkommen
re.findall(InfoStr+"([\w\x00\x20\r\n]+)\x01", RAWdata)
Gruß
Dookie
PS.: jetzt weiss ich woher das \0x01 kam, mit 0x01 wird in Python eine Hexadezimalzahl direkt im Code geschrieben.

Verfasst: Mittwoch 24. November 2004, 20:10
von jens
Alle drei Varianten funktionieren leider nicht... es wird nie etwas gefunden...
Hab das Listing, mit Beispielanwendung mal hier gepostet:
http://python.sandtner.org/viewtopic.php?p=12561