c77ar Geschrieben 18. Oktober 2021 Geschrieben 18. Oktober 2021 Hallo zusammen, mein Name ich Christian. Ich hänge gerade an folgendem Problem fest: Per OCR werden bestimmte Bereich in einem Dokument gescannt. Per RegEx sollen nun teile davon ausgelesen werden. Der OCR Text lautet (zum Beispiel) wie folgt: Bauvorhaben: HV Musterverwaltung - Projektbezeichnung B21-09498 Folgendes ist gegeben: das Wort "Bauvorhaben:" ist immer vorhanden und soll nicht übergeben werden. Die Projektnummer "B21-09498" wird ebenfalls nicht benötigt. Diese ist aber Variabel und nach zwei Schemata aufgebaut: entweder "B" gefolgt von der Jahreszahl, Bindestrich und dann 5 Ziffern ODER "B" gefolgt von der Jahreszahl, KEIN Bindestrich und 6 Ziffern. Diese Projektnummer lese ich bereits für ein zweites Feld mit folgendem Ausdruck aus: [B][0-9]{2}[-][0-9]{5}|[B][0-9]{8} Das klappt wunderbar. Ich hänge nun, weil ich nicht weiß, wie ich die beiden beschriebenen Blöcke am Anfang und Ende aus der Suche ausschließe. Ich möchte lediglich den Bereich "HV Musterverwaltung - Projektbezeichnung" haben. Bisher habe ich folgendes gemacht: (?<=Bauvorhaben: ).* Damit bekomme ich den gesamten String geliefert. Aber wie schließe ich nun die Projektnummer aus? Vielleicht hab jemand von euch eine Idee. Schönen Abend euch! Gruß Christian PS Gibt es bei euch auch einen Bereich wo man sich Vorstellen darf? Zitieren
_n4p_ Geschrieben 18. Oktober 2021 Geschrieben 18. Oktober 2021 Jetzt musst du nur noch beides miteinander kombinieren, der hintere Teil müsste in ein Lookahead eingebaut werden. Zitieren
blaargh Geschrieben 19. Oktober 2021 Geschrieben 19. Oktober 2021 (bearbeitet) vor 9 Stunden schrieb c77ar: Aber wie schließe ich nun die Projektnummer aus? (Folgender Vorschlag unter der Prämisse dass du ECMAScript regex verwendest) Ich würde es mit einer non-capturing group machen: (Bauvorhaben\:.*)(?:B\d{2}-\d{5}) Der fett markierte Teil ist die Syntax für eine non-capturing group. Damit bekommst als subexpression match nur den vorderen String. Bearbeitet 19. Oktober 2021 von blaargh Zitieren
JimTheLion Geschrieben 19. Oktober 2021 Geschrieben 19. Oktober 2021 Moin, steht die Projektnummer immer am Ende? Dann kannst du einfach alles hintereinander wegschreiben. ^Bauvorhaben: (?<ergebnis>.*)(?>B\d{2}-\d{5}|B\d{8})$ Wenn die Projektnummer irgendwo im Text vorkommen kann, würde ich nachsehen welche Möglichkeiten du hast um den Text zu bearbeiten. Anstatt einen komplizierten großen Regex draufzujagen, könntest du evtl. mit 2 einfachen die Projektnummer entfernen. vor 9 Stunden schrieb c77ar: PS Gibt es bei euch auch einen Bereich wo man sich Vorstellen darf? Sure! Zitieren
Gooose Geschrieben 19. Oktober 2021 Geschrieben 19. Oktober 2021 vor 10 Stunden schrieb c77ar: Vielleicht hab jemand von euch eine Idee. Alternativ splittest du den String und ignorierst den ersten und den letzten Teil des Arrays. Zitieren
_n4p_ Geschrieben 19. Oktober 2021 Geschrieben 19. Oktober 2021 vor 13 Stunden schrieb blaargh: (Bauvorhaben\:.*)(?:B\d{2}-\d{5}) Damit bekommt man aber zwei matches für group 0 und group 1? und in beiden steht auch "Bauvorhaben", was ja nicht im Ergebnis stehen sollte. vor 13 Stunden schrieb PVoss: ^Bauvorhaben: (?<ergebnis>.*)(?>B\d{2}-\d{5}|B\d{8})$ mit lookahead und lookbehind Groups spart man sich die capture Group für das gewünscht Ergebnis und bekommt nur ein einzelnes Match auf den gewünschten Teilstring. Da wir ja schon Lösungen posten ... (?<=Bauvorhaben: ).*(?=B\d{2}-\d{5}|B\d{8}) JimTheLion reagierte darauf 1 Zitieren
blaargh Geschrieben 20. Oktober 2021 Geschrieben 20. Oktober 2021 vor 9 Stunden schrieb _n4p_: Damit bekommt man aber zwei matches für group 0 und group 1? und in beiden steht auch "Bauvorhaben", was ja nicht im Ergebnis stehen sollte. Den Teil habe ich überlesen, ist aber auch trivial zu ergänzen: (?:BAUVORHABEN\:)(.*)(?:B\d{2}-\d{5}). Und joa, du bekommst dann zwei Matches, unter anderem eben auch ein Subexpression Match mit dem gewünschten String. Lookbehind wird von std::regex in C++ zum Beispiel nicht supported, subexpression matches funktionieren auch Jahre zurück in so gut wie jeder regex engine. Zitieren
c77ar Geschrieben 14. November 2021 Autor Geschrieben 14. November 2021 Hallo Leute, sorry dass ich mich jetzt erst melde! Ich hatte leider einen familiären Zwischenfall der mich voll in Beschlag nahm. Vielen Dank für eure Hilfe in dieser Sache! Liebe Grüße Christian Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.