python3 метод split не регистрирует мое выражение регулярного выражения - PullRequest
0 голосов
/ 04 мая 2020

Текущая проблема

Я собрал скрипт, который загружает вложения из почтового ящика в gmail и по большей части извлекает список переменных на основе электронного письма, из которого получена информация. Однако я обнаружил, что в некоторых случаях «идентификатор сообщения» электронной почты может быть указан как «идентификатор сообщения» или «идентификатор сообщения». Из-за этого я попытался использовать регулярные выражения, чтобы учесть, что между «Сообщением» и «Идентификатором» может быть что угодно, но мой код выдает ошибки независимо от того, что я пытался до сих пор с выражением.

Ошибка

> Traceback (most recent call last):   File "email-downloader.py", line
> 64, in <module>
>     msg_id = str(email_message).split("Message+\.*: ", 1)[1].split("\n", 1)[0] IndexError: list index out of range

То, что я пробовал

Я посмотрел в Интернете и не смог найти ответ в прошлом, который смог решить эту проблему. Я также пытался изменить регулярное выражение с другими + местами размещения или \ и []

Code

        email_from = str(email_message).split("From: ", 1)[1].split("\n", 1)[0]
        subject = str(email_message).split("Subject: ", 1)[1].split("\n", 1)[0]
        ext = os.path.splitext(fileName)[1]
        delivered = str(email_message).split("Date: ", 1)[1].split("\n", 1)[0]
        msg_id = str(email_message).split("Message+\.*: ", 1)[1].split("\n", 1)[0]

        print('File: "{file}".'.format(file=fileName))
        print('Ext: "{ext}".'.format(ext=ext))
        print('Subject: "{subject}".'.format(subject=subject))
        print('From: "{email_from}".'.format(email_from=email_from))
        print('Date Delivered: "{delivered}".'.format(delivered=delivered))
        print('Message ID: "{msg_id}".'.format(msg_id=msg_id))
        print("\n")                                                                                                                                                                                                                                  
        print('"{msg_id}"   "{delivered}"   "{file}"        "{subject}"     "{email_from}"'.format(file=fileName,subject=subject,email_from=email_from,msg_id=msg_id,delivered=delivered), file=open("array/client-ref.tsv", "a"))
        os.rename(os.path.join(dirName,fileName), os.path.join(dirName,msg_id + ext))

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Чтобы использовать регулярные выражения для разбиения строки, вы должны использовать метод split(pattern, string) из библиотеки re в python. Следующий код должен делать то, что вы хотите

import re
msg_id = re.split("Message.*: ", str(email_message))[1].split("\n", 1)[0]
0 голосов
/ 04 мая 2020

Метод split() не работает с регулярным выражением. Вам нужно будет импортировать библиотеку регулярных выражений re и использовать re.split(), чтобы достичь желаемого. Если «Идентификатор сообщения» и «Идентификатор сообщения» - единственные две возможности, вам не нужно использовать регулярное выражение. Вы можете сначала заменить одно выражение другим, а затем разделить текст:

msg_id = str(email_message).replace('Message-ID', 'Message ID', 1)
msg_id = msg_id.split("Message ID", 1)[1].split("\n", 1)[0]

В качестве примечания, я не знаю, что такое type email_message, но имеет смысл преобразовать str только один раз и сохраните его в другой переменной, например, если вам понадобится email_message в исходном type позже. Я бы не рекомендовал конвертировать его в str более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...