Im speziellen Fall einer Datei, wenn Sie Speicher- Ordnen Sie die Datei mit mmap
zu und wenn Sie mit Bytestrings anstelle von Unicode arbeiten, können Sie eine Memory-Mapped-Datei an re
so füttern, als wäre es ein Bytestring und es wird einfach funktionieren. Dies ist durch Ihren Adressraum begrenzt, nicht durch Ihren Arbeitsspeicher. Ein 64-Bit-Rechner mit 8 GB RAM kann also eine 32-GB-Datei problemlos im Speicher abbilden.
Wenn Sie dies tun können, ist es eine sehr gute Option. Wenn Sie nicht können, müssen Sie sich an unechteren Optionen wenden.
Der 3rd-Party regex
Modul (nicht re
) bietet teilweise Übereinstimmung Unterstützung, die verwendet werden kann Streaming-Unterstützung zu bauen ... aber es ist chaotisch und hat viele Vorbehalte. Dinge wie Lookbehinds und ^
werden nicht funktionieren, Zero-Width-Matches wäre schwierig, richtig zu bekommen, und ich weiß nicht, ob es richtig mit anderen erweiterten Funktionen regex
Angebote interagieren würde und re
nicht. Dennoch scheint es einer vollständigen Lösung am nächsten zu sein.
Wenn Sie passieren partial=True
zu regex.match
, regex.fullmatch
, regex.search
oder regex.finditer
, dann zusätzlich zum vollständigen Übereinstimmungen Berichterstattung, regex
auch Dinge berichten, die eine Übereinstimmung, wenn die Daten erweitert werden könnte:
In [10]: regex.search(r'1234', '12', partial=True)
Out[10]: <regex.Match object; span=(0, 2), match='12', partial=True>
Es Meldet eine Teilübereinstimmung anstelle einer vollständigen Übereinstimmung, wenn mehr Daten das Übereinstimmungsergebnis ändern könnten, so wird beispielsweise regex.search(r'[\s\S]*', anything, partial=True)
immer eine Teilübereinstimmung sein.
Mit diesem können Sie ein gleitendes Fenster von Daten halten, die übereinstimmen, erweitern Sie es, wenn Sie das Ende des Fensters treffen und verbrauchte Daten von Anfang an verwerfen. Unglücklicherweise funktioniert alles, was durch Daten, die vom Anfang der Zeichenfolge verschwinden würden, nicht funktionieren würde, daher sind Lookbehinds, ^
, \b
und \B
out. Zero-width-Matches müssten auch vorsichtig behandelt werden. Hier ist ein Proof of Concept, das ein gleitendes Fenster über einer Datei oder einem dateiähnlichen Objekt verwendet:
das ist gegen die Idee von Regex. – SilentGhost
@SlientGhost: Nicht unbedingt. Sie könnten einige (unendliche) Streams mit Regexes parsen, die immer am aktuellen Anfang des Streams übereinstimmen und die Übereinstimmungen als Iterator zurückgeben (und nur die Zeichen konsumieren, die aus dem Stream stammen). – MartinStettner
@MartinStettner: Nun, Sie könnten, wenn es ein automatentheoretischer Matcher ohne Backrefs wäre (und ein paar andere Dinge wie Lookahead-Constraints). Solange der RE auf einen einzelnen endlichen Automaten (entweder NFA oder DFA) kompilieren kann, kann er die Dinge in einem Durchgang abgleichen und damit die Erkennung eines unendlichen Stroms bewältigen. (Aber Python verwendet PCRE, das nicht automatisch-theoretisch ist und alle Bytes früher benötigt.) –