如何修复regex以捕获whatsapp导出的带有移动和名称混合的文本头



我导出了whatsapp聊天以用于机器学习,但在非utf-8位图字符和标头清理方面遇到了困难。有些标题是手机号码,有些是名字。找不到与所有正则表达式匹配的正则表达式。同样如前所述,我找不到解析这个文件的方法,因为在打开类似的文件时,我在解析使用utf-8编码的位图时出错

with open("file.txt", "r", encoding="utf-8") as f:

whatsap导出示例:

10/14/18, 14:49 - ‪+90 999 555 55 55‬: <Media omitted>
10/14/18, 14:49 - ‪+90 999 555 55 55‬: 😀😀
10/14/18, 15:23 - Mehmet Senturk: <Media omitted>
10/14/18, 15:57 - Mehmet Senturk: <Media omitted>
10/14/18, 16:00 - Gülden Çağıl 🎸🤘: done
10/14/18, 16:05 - Mehmet Senturk: 👍
10/14/18, 17:08 - Niyazi Şakiroğlu: Beyler yeni app hazır
10/14/18, 17:08 - Niyazi Şakiroğlu: Duuple AppStore ve playstore da yayında
10/14/18, 17:08 - Niyazi Şakiroğlu: Duuple
10/14/18, 17:08 - Niyazi Şakiroğlu: Görüşleriniz bekliyorum
10/14/18, 17:09 - Niyazi Şakiroğlu: <Media omitted>
10/14/18, 18:47 - ‪+90 999 999 99 99‬: Cok guzel app, hayirli olsun :))
10/14/18, 18:47 - ‪+90 999 999 70 99‬: Herkes indirmeli
10/14/18, 18:52 - ‪+90 999 999 99 99‬: İndirdim, birazdan inceleyip yorum yaparım....

我想清理为:

done
Beyler yeni app hazır
Duuple AppStore ve playstore da yayında
Duuple
Görüşleriniz bekliyorum
Cok guzel app, hayirli olsun :))
Herkes indirmeli
İndirdim, birazdan inceleyip yorum yaparım....

我有以下正则表达式模式,但没有帮助。

mediaPattern = r"(<Media omitted>)" # Because it serves no purpose
regexMedia = re.compile(mediaPattern, flags=re.M)
dateAndTimepattern = r"(d+/d+/d+)(,)(s)(d+:d+)(s)(-)(s+)[0-9A-Za-züğışçöÜĞİŞÇÖs]+[^w]+(:)?"
regexDate = re.compile(dateAndTimepattern, flags=re.M)
nonchar_pattern = r"[^ws<>:-/,üğşçöıÜĞİŞÇÖ]+"
regexnonchar = re.compile(nonchar_pattern, flags=re.M)

非常感谢您的帮助

首先,您的输入文件中存在一些错误。如果它包含位图,则它不是有效的utf-8编码文本文件,而是用位图替换有效utf-8表情符号字符的其他格式。

但是您复制的文本数据示例是正确的utf-8,所以我认为您可以始终使用它作为输入。

解决了这个问题后,您使用的正则表达式将与给定的数据样本不匹配,这主要是因为您明确列出了字符类,例如不包括数字,因此电话号码在数据中不匹配。

我建议不要使用这种方法,并对任意字段(如用户名和消息负载)使用通用捕获。如果需要,可以在将文本文件拆分为记录后清除这些字段。

也就是说,我会使用这个表达式:

pattern = ^([0-9]{2}/[0-9]{2}/[0-9]{2}),(s[0-9]{2}:[0-9]{2})s-s(.*?):s(.*)$

它将日期、时间、用户名和消息负载分为四个捕获组。例如:

import re
rx = re.compile( "([0-9]{2}/[0-9]{2}/[0-9]{2}),s([0-9]{2}:[0-9]{2})s-s(.*?):s(.*)" )
with open( "file.txt", "r", encoding="utf-8" ) as fh:
line = fh.readline()
while line:
data = rx.match( line ).group( 1, 2, 3, 4 )
print( "date :", data[0], "time :", data[1], "user :", data[2], "msg  :", data[3] )
line = fh.readline()

给出

date : 10/14/18 time : 15:57 user : Mehmet Senturk msg  : <Media omitted>
date : 10/14/18 time : 16:00 user : Gülden Çağıl 🎸🤘 msg  : done
date : 10/14/18 time : 16:05 user : Mehmet Senturk msg  : 👍
date : 10/14/18 time : 17:08 user : Niyazi Şakiroğlu msg  : Beyler yeni app hazır

在解析完文本文件结构后,我会进行所有的数据清理(比如删除表情符号和文字)。

尝试同时做这两件事需要一个非常混乱的regex模式。

我在构建分析WhatsApp聊天的工具时遇到了类似的问题。我使用了一个Javascript库,它们使用了多个regex表达式,您也应该能够与Python一起使用:

过滤概述:

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 = /[-/.] ?/;

手柄附件<gt"即使您导出的聊天没有附件。(例如<介质已提交>)

const regexAttachment = /<.+:(.+)>/;`

对我来说,这几乎适用于所有语言(由于WhatsApp导出与系统语言不同,整个表达式的格式也不同。例如,2012年12月2日晚上11点与2012年2月23日23:00)

最新更新