解析WhatsApp消息:如何解析多行文本

时间:2018-07-25 19:57:19

标签: python regex parsing

我有一个WhatsApp消息文件,我想保存为csv格式。文件看起来像这样:

  

[04/02/2018,20:56:55] Name1:此聊天和呼叫的消息现在   通过端到端加密进行保护。
  [04/02/2018,20:56:55]名称1:Content1。
  更多内容。
  [04/02/2018,23:24:44] Name2:Content2。

我想将邮件解析为date, sender, text列。我的代码:

with open('chat.txt', "r") as infile, open("Output.txt", "w") as outfile:
    for line in infile:
        date = datetime.strptime(
            re.search('(?<=\[)[^]]+(?=\])', line).group(), 
            '%d/%m/%Y, %H:%M:%S')
        sender = re.search('(?<=\] )[^]]+(?=\:)', line).group()
        text = line.rsplit(']', 1)[-1].rsplit(': ', 1)[-1]

        new_line = str(date) + ',' + sender + ',' + text
        outfile.write(new_line)

我在处理多行文本时遇到问题。 (有时,我在消息中会跳到新行-在这种情况下,该行中只有文字,应该是前一行的一部分。) 我也对解析日期时间,发件人和文本的更多pythonic方法持开放态度。 我的代码的结果是错误的,因为每一行都没有所有条件(但是正确解析了日期,发件人,文本):

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-33-efbcb430243d> in <module>()
      3     for line in infile:
      4         date = datetime.strptime(
----> 5             re.search('(?<=\[)[^]]+(?=\])', line).group(),
      6             '%d/%m/%Y, %H:%M:%S')
      7         sender = re.search('(?<=\] )[^]]+(?=\:)', line).group()

AttributeError: 'NoneType' object has no attribute 'group'

想法:也许使用try-catch,然后以某种方式在仅文本后附加行? (听起来不像Pythonic。)

1 个答案:

答案 0 :(得分:1)

这是将多余的文本追加到前一行的工作。

这是在检查正则表达式是否失败,在这种情况下,只需将行写到文件中而不用换行符\n,以便将其追加到文件的前一行。

start = True

with open('chat.txt', "r") as infile, open("Output.txt", "w") as outfile:
    for line in infile:
        time = re.search(r'(?<=\[)[^]]+(?=\])', line)
        sender = re.search(r'(?<=\] )[^]]+(?=\:)', line)
        if sender and time:
            date = datetime.strptime(
                time.group(),
                '%d/%m/%Y, %H:%M:%S')
            sender = sender.group()
            text = line.rsplit(r'].+: ', 1)[-1]
            new_line = str(date) + ',' + sender + ',' + text
            if not start: new_line = '\n' + new_line
            outfile.write(new_line)
        else:
            outfile.write(' ' + line)
        start = False

即使正则表达式正常工作,您似乎也没有在文件中写新行,所以我也添加了它。