[英]Whatsapp chat log parsing with regex
我正在嘗試使用正則表達式解析 WhatsApp 聊天日志。 我有一個適用於大多數情況的解決方案,但我希望改進它,但不知道如何改進,因為我對正則表達式很陌生。
chat.txt
文件如下所示:
[06.12.16, 16:46:19] Person One: Wow thats amazing
[06.12.16, 16:47:13] Person Two: Good morning and this goes over multiple
lines as it is a very long message
[06.12.16, 16:47:22] Person Two: ::
雖然到目前為止我的解決方案可以正確解析這些消息中的大部分,但是我有幾百個消息以冒號開頭的情況,就像上面的最后一個例子一樣。 這導致第二Person Two: :
的不必要的價值Person Two: :
作為發件人。
這是我目前正在使用的正則表達式:
pattern = re.compile(r'\[(?P<date>\d{2}\.\d{2}\.\d{2}),\s(?P<time>\d{2}:\d{2}:\d{2})]\s(?P<sender>(?<=\s).*(?::\s*\w+)*(?=:)):\s(?P<message>(?:.+|\n+(?!\[\d{2}\.\d{2}\.\d{2}))+)')
任何有關如何解決此錯誤的建議將不勝感激!
在應用正則表達式之前,我會預處理列表以刪除連續的冒號。 所以對於每一行,例如
line = [06.12.16, 16:47:22] Person Two: ::
line = line.replace("::","")
這會給:
[06.12.16, 16:47:22] Person Two:
然后,您可以對預處理過的數據調用正則表達式函數。
在構建分析 WhatsApp 聊天的工具時,我遇到了類似的問題。
主要問題是 chat.txt 的格式取決於您的系統語言。 在德語中你會得到這個16:47 ,但在英語中它可能是PM並且美國用戶的月份格式發生了變化......
我使用的庫有以下 4 個正則表達式。 到目前為止,它們涵蓋了所有發生的案例(拉丁語)。
過濾一般:
const regexParser = /^(?:\u200E|\u200F)*\[?(\d{1,4}[-/.] ?\d{1,4}[-/.] ?\d{1,4})[,.]? \D*?(\d{1,2}[.:]\d{1,2}(?:[.:]\d{1,2})?)(?: ([ap]\.? ?m\.?))?\]?(?: -|:)? (.+?): ([^]*)/i;
過濾系統消息:
const regexParserSystem = /^(?:\u200E|\u200F)*\[?(\d{1,4}[-/.] ?\d{1,4}[-/.] ?\d{1,4})[,.]? \D*?(\d{1,2}[.:]\d{1,2}(?:[.:]\d{1,2})?)(?: ([ap]\.? ?m\.?))?\]?(?: -|:)? ([^]+)/i;
日期:
const regexSplitDate = /[-/.] ?/;
處理在“< >”中傳遞的附件,即使您導出沒有附件的聊天也是如此。 (例如 <media ommitted>)
const regexAttachment = /<.+:(.+)>/;`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.