Seite 1 von 1
Zeilenumbrüche vor gesuchter RegEx einfügen
Verfasst: Dienstag 7. Mai 2019, 15:25
von 5j7o1
Hallo liebe deutsche python Community,
Ich möchte eine .txt File auswerten, eher gesagt ein WhatsApp Chatlog. Ich muss aber das Format nutzen welches iOS erstellt, da man unter Android nicht den gesamten Chatverlauf exportieren kann sondern nur die letzten 40.000 Nachrichten
Der Aufbau ist wie folgt:
[DD.MM.YY, HH:MM:SS] Du hast die Gruppe “XY” erstellt.
[DD.MM.YY, HH:MM:SS] XY: Nachrichten an diese Gruppe sind jetzt mit Ende-zu-Ende-Verschlüsselung geschützt.
[DD.MM.YY, HH:MM:SS] YX: Link
[DD.MM.YY, HH:MM:SS] YX: Nachricht
[DD.MM.YY, HH:MM:SS] YZ: Nachricht
[DD.MM.YY, HH:MM:SS] YZ: Nachricht
Nun möchte ich jeglichen Zeilenumbruch entfernen und bevor die RegEx Funktion genutzt wird möchte ich vor jedem
[DD.MM.YY, HH:MM:SS]
wieder einen Zeilenumbruch in die Textdatei einbinden.
Habt ihr dazu eine Idee, bzw. einen anderen Vorschlag wie man einfacher nach Daten/Kriterien filtern kann?
Danke!
Re: Zeilenumbrüche vor gesuchter RegEx einfügen
Verfasst: Dienstag 7. Mai 2019, 15:36
von __blackjack__
@5j7o1: Darf man fragen *warum* Du das machen willst?
Re: Zeilenumbrüche vor gesuchter RegEx einfügen
Verfasst: Dienstag 7. Mai 2019, 15:40
von 5j7o1
Warum ich die Zeilenumbrüche machen will oder das Chatlog auswerten will?`
Auswerten einfach nur aus reinem Interesse an den Daten, so bekommt man halt raus wer am meisten schreibt, zu welcher Uhrzeit, in welchen Monaten am meisten/wenigsten geschrieben wird.
Re: Zeilenumbrüche vor gesuchter RegEx einfügen
Verfasst: Dienstag 7. Mai 2019, 15:44
von __blackjack__
@5j7o1: Weder noch, ich wollte wissen warum Du die Zeilenumbrüche überhaupt erst entfernen willst. Was ist der Sinn hinter der Operation? Denn wenn Du die nicht entfernst, brauchst Du sie auch nicht wieder einfügen. Wobei auch das dann wieder die Frage aufwirft warum sie wieder eingefügt werden sollen.
Re: Zeilenumbrüche vor gesuchter RegEx einfügen
Verfasst: Dienstag 7. Mai 2019, 18:02
von 5j7o1
__blackjack__ hat geschrieben: Dienstag 7. Mai 2019, 15:44
@5j7o1: Weder noch, ich wollte wissen warum Du die Zeilenumbrüche überhaupt erst entfernen willst. Was ist der Sinn hinter der Operation? Denn wenn Du die nicht entfernst, brauchst Du sie auch nicht wieder einfügen. Wobei auch das dann wieder die Frage aufwirft warum sie wieder eingefügt werden sollen.
Ich würde gerne den Chatlog in ein DataFrame umbauen. Die einfachste Methode die mir dafür eingefallen ist, ist jede Zeile in dem String als neue Column in dem DataFrame zu verwenden. Allerdings sind in der Quelldatei auch die Zeilenumbrüche innerhalb der Nachrichten enthalten, nicht nur die Zeilenumbrüche vor einer neuen Nachricht (also vor dem Timestamp).
Entsprechend würde ich gerne die Zeilenumbrüche innerhalb der Nachrichten aus dem Spiel nehmen und vor dem Timestamp einen neuen einfügen.
Re: Zeilenumbrüche vor gesuchter RegEx einfügen
Verfasst: Dienstag 7. Mai 2019, 18:35
von __blackjack__
@5j7o1: Warum zur Hölle eine *Spalte* pro Nachricht? Es würde doch viel mehr Sinn ergeben eine Spalte für das Datum und eine für die Nachrichten zu machen und dann eine *Zeile* pro Nachricht. Beziehungsweise könnte man auch nur eine Spalte für die Nachrichten (eine pro Zeile im DataFrame) machen und das Datum als Index verwenden. Das wäre dann ja eine Zeitreihe und genau das wofür Pandas gut geeignet ist. Andererseits ist es für Textverarbeitung eher wieder nicht geeignet. Wenn Du also den Zeitstempel der Nachrichten als Index nicht auch irgendwie sinnvoll benutzt, mit Pandas-Methoden, dann macht es sehr wahrscheinlich auch keinen Sinn das ganze in einen DataFrame zu stecken.
Re: Zeilenumbrüche vor gesuchter RegEx einfügen
Verfasst: Mittwoch 8. Mai 2019, 04:08
von snafu
@5j7o1: Wofür willst du pandas in diesem Zusammenhang denn verwenden? Sollen die Nachrichten nach bestimmten Kriterien gruppiert werden? Planst du bestimmte Abfragen?
Eine Spalte pro Chat-Zeile ist jedenfalls ungünstig. Stell dir einen DataFrame wie eine Tabelle vor: Jeder Datensatz ist eine Tabellenzeile. Die einzelnen Bestandteile jedes Datensatzes werden den verschiedenen Spalten zugeordnet. Hier also am sinnvollsten das Datum und die eigentliche Nachricht (wie schon zuvor erwähnt wurde). Dazu eventuell noch Sender und Empfänger. Und mit dieser Struktur kannst du dann weiterarbeiten.
Re: Zeilenumbrüche vor gesuchter RegEx einfügen
Verfasst: Mittwoch 8. Mai 2019, 05:20
von snafu
So könnte man die Daten dann parsen:
Code: Alles auswählen
from io import StringIO
import pandas as pd
TESTFILE = StringIO("""\
[08.05.19, 06:20:03] Du hast die Gruppe “XY” erstellt.
[08.05.19, 06:20:03] XY: Nachrichten an diese Gruppe sind jetzt mit Ende-zu-Ende-Verschlüsselung geschützt.
[08.05.19, 06:20:11] YX: Link
[08.05.19, 06:20:55] YX: Nachricht
[08.05.19, 06:21:16] YZ: Nachricht
[08.05.19, 06:23:09] YZ: Nachricht""")
def parse_chatlog(logfile):
splitted = (line[1:].split('] ', 1) for line in logfile)
parsed = ((pd.to_datetime(timestamp, dayfirst=True), message.strip())
for timestamp, message in splitted)
return pd.DataFrame(parsed, columns=['Timestamp', 'Message'])
if __name__ == '__main__':
print(parse_chatlog(TESTFILE))
Re: Zeilenumbrüche vor gesuchter RegEx einfügen
Verfasst: Mittwoch 8. Mai 2019, 16:13
von 5j7o1
Ich meine natürlich Zeile, sorry

Re: Zeilenumbrüche vor gesuchter RegEx einfügen
Verfasst: Mittwoch 8. Mai 2019, 18:14
von snafu
Hier mal mit einem regulären Ausdruck geparst und zusätzlicher Spalte für den (optionalen) Benutzernamen:
Code: Alles auswählen
from io import StringIO
import pandas as pd
TESTFILE = StringIO("""\
[08.05.19, 06:20:03] Du hast die Gruppe “XY” erstellt.
[08.05.19, 06:20:03] XY: Nachrichten an diese Gruppe sind jetzt mit Ende-zu-Ende-Verschlüsselung geschützt.
[08.05.19, 06:20:11] YX: Link
[08.05.19, 06:20:55] YX: Nachricht
[08.05.19, 06:21:16] YZ: Nachricht
[08.05.19, 06:23:09] YZ: Nachricht""")
def parse_chatlog(logfile):
pattern = re.compile(r'\[(?P<ts>.*)\] '
r'((?P<user>.*): )?'
r'(?P<message>.*)')
groups = (pattern.match(line).groupdict() for line in logfile)
parsed = (
(pd.to_datetime(g['ts'], dayfirst=True), g['user'] or '', g['message'])
for g in groups
)
return pd.DataFrame(parsed, columns=['Timestamp', 'Username', 'Message'])
if __name__ == '__main__':
print(parse_chatlog(TESTFILE))
Re: Zeilenumbrüche vor gesuchter RegEx einfügen
Verfasst: Mittwoch 8. Mai 2019, 19:48
von __blackjack__
Wobei ja irgendwo die Info stand das in den Nachrichten selbst auch Zeilenumbrüche vorkommen können, man kann das also nicht als eine Zeile = eine Nachricht behandeln.
Re: Zeilenumbrüche vor gesuchter RegEx einfügen
Verfasst: Mittwoch 8. Mai 2019, 23:25
von 5j7o1
Ja genau, in vielen Nachrichten mit Links/Antworten auf Nachrichten sind Zeilenumbrüche in dieser Nachricht vorhanden, die ignoriert werden müssen. Deswegen wollte ich ja alle Zeilenumbrüche entfernen und vor jeden Timestamp einen einfügen um diese unnötigen Zeilenumbrüche zu eliminieren
Re: Zeilenumbrüche vor gesuchter RegEx einfügen
Verfasst: Mittwoch 8. Mai 2019, 23:34
von __blackjack__
@5j7o1: Sind die denn unnötig? Die sind ja schon Bestandteil der Nachrichten. Ich würde die beibehalten. Man muss halt die Eingabe in Nachrichten aufteilen, wobei eine Nachricht jeweils mit einem Zeitstempel beginnt.