93578
Goto Top

Regex - zusammengefasste Wörter finden und korrekt trennen???

Hallo Community,

ich habe folgendes Problem: in einer Text-Datei mit fast 15.000.000 Wörter (1 Wort pro Zeile) habe ich durch ein Berabeitungsfehler einige Wörter zusammengefasst bekommen, die früher durch ein Bindestrich getrennt waren:

Z.B.

"Ist"-Zustand:

MaxMoritzStraße
MaxPlankInstitut
KarlHeinz
TheodorHeinrichMariaVonSchmidt

"Soll"-Zustand:

Max-Moritz-Straße
Max-Plank-Institut
Karl-Heinz
Theodor-Heinrich-Maria-Von-Schmidt

oder (noch besser):

Max
Moritz
Straße
Max
Plank
Institut
Karl
Heinz
Theodor
Heinrich
Maria
Von
Schnidt

Wie kann ich das korrigieren? Klein/Groß-Schreibung soll dabei beachtet werden.

Vielen Dank!

Content-Key: 331050

Url: https://administrator.de/contentid/331050

Printed on: April 26, 2024 at 18:04 o'clock

Mitglied: 132272
Solution 132272 Mar 03, 2017 updated at 16:09:33 (UTC)
Goto Top
Mach ein Case Sensitive Replace mit folgendem Pattern:
(?<!^)(?=[A-Z])
und als Ersetzungsstring ein Zeilenumbruch \r\n

Sucht mit einem non matching Negative Lookbehind nach keinem Zeilenanfang und mit einem non matching Positive Lookahead nach einem Großbuchstaben und setzt dort dann den Zeilenumbruch beim Replace ein.

Gruß
Member: Kraemer
Solution Kraemer Mar 03, 2017 at 16:03:20 (UTC)
Goto Top
[OT]
Zitat von @132272:
> (?<!^)(?=[A-Z])
> 
und als Ersetzungsstring ein Zeilenumbruch \r\n
Kranker ### - mit Notepad++ funktioniert das einwandfrei. Muss ich mir unbedingt mal ansehen wie das funktioniert.
Member: Sheogorath
Solution Sheogorath Mar 03, 2017 at 16:03:37 (UTC)
Goto Top
Moin,

Je nachdem welche Sprache du nehmen willst, kann es hier unterschiede geben.

Beim nutzen von PCRE wird es einfach. Ich empfehle ja immer www.regex101.com als nette plattform zum ausarbeiten von Regex. Sie bieten übrigens auch Code generation und eine wunderbare Referenz an bezüglich Match-Pattern.

Hier mal mein Beispiel für die Version mit Bindestrich: https://regex101.com/r/sLKPru/2

Wenn du lieber alles in einzelne Zeilen haben willst, einfach den bindestrich durch `\n` ersetzen.

Du solltest ein bisschen rumspielen und ausprobieren, ich denke ich habe dir da einen guten Ansatz geliefert ;)

Gruß
Chris
Mitglied: 93578
93578 Mar 03, 2017 at 16:05:08 (UTC)
Goto Top
Danke. Kannst du mir es ein bisschen erklären (mit dem Perl)? Geht so was nicht mit sed?
Mitglied: 132272
Solution 132272 Mar 03, 2017 updated at 17:06:29 (UTC)
Goto Top
Perl war nur der Modus wenn du Ultraedit genutzt hättest.

Du musst nur eine Regex Engine benutzen welche
positive lookaheads und negative lookbehinds unterstützt.

SED unterstützt diese nicht aber dort kannst du alternativ das hier nutzen:
sed -re 's/([^^])([A-Z])/\1\n\2/g' datei.txt >datei-neu.txt
Mitglied: 93578
93578 Mar 03, 2017 at 16:07:50 (UTC)
Goto Top
Danke.