Если вы хотите удалить из письма только теги «Откуда», «Отправлено», «Копия», «Тема» и «Переадресовано», вы можете использовать регулярное выражение.
import re
with open('email_input.txt', 'r') as input:
lines = input.readlines()
no_new_lines = [i.strip() for i in lines]
for line in no_new_lines:
email_component = re.compile(r'((From:|Sent:|To:|Cc:|Subject:|Forwarded message).*)', re.IGNORECASE)
remove_component = re.findall(email_component, line)
if remove_component:
print(line)
# output
‐‐‐‐‐‐‐‐‐‐ Forwarded message ‐‐‐‐‐‐‐‐‐‐
From: Mr.A, <.Mr.A@abc.com>
Sent: Wednesday, July 25, 2018 2:27 PM
To: , Tim /ANN; Abd, May /ANN
Cc: Mr.A, ; Theoder Jerry,
Subject: [EXTERNAL] RE: Holdings: XXXX SPA – mfno.1322
Относительно удаления контента после слова "regards".Я не добавил это к своему регулярному выражению, потому что электронные письма могут быть подписаны несколькими способами.Вот некоторые из наиболее распространенных способов:
Best,
Best regards,
Best wishes,
Fond regards,
Kind regards,
Regards,
Sincerely,
Sincerely yours,
Thank you,
With appreciation,
With gratitude,
Yours sincerely,
ОБНОВЛЕННЫЙ ОТВЕТ ОДИН
Приведенный ниже обновленный ответ очищает еще немного ввода электронной почты, но требуется дополнительная очистка.
import re
with open('email_input.txt', 'r') as input:
lines = input.readlines()
# Remove some of the extra lines
no_new_lines = [i.strip() for i in lines]
# regex to catch header lines
email_component = re.compile(r'((From:|Sent:|To:|Cc:|Subject:|Date:|Forwarded message).*)', re.IGNORECASE)
remove_headers = [x for x in no_new_lines if not email_component.findall(x)]
# regex to catch greeting lines
greeting_component = re.compile(r'(Dear.*)', re.IGNORECASE)
remove_greeting = [x for x in remove_headers if not greeting_component.findall(x)]
# regex to catch lines with contact details
contact_component = re.compile(r'(Phone.*:)|(Cell:.*)|(Email:.*)', re.IGNORECASE)
remove_contacts = [x for x in remove_greeting if not contact_component.findall(x)]
# regex to catch lines with salutation
email_salutation_component = re.compile(r'Best,(.*?)|Best regards,(.*?)|Best wishes,(.*?)|Fond regards,(.*?)|'
r'Kind regards(.*?)|Regards,(.*?)|Sincerely,(.*?)|Sincerely yours,(.*?)|'
r'Thank you,(.*?)|With appreciation,(.*?)|Yours sincerely,(.*?)', re.IGNORECASE)
remove_salutations = [x for x in remove_contacts if not email_salutation_component.findall(x)]
# do something else
ОБНОВЛЕННЫЙ ОТВЕТ ДВА
В обновленном ответе ниже используется библиотека электронной почты python.Мой входной файл был оригинальным сообщением электронной почты, полученным из моего почтового клиента.Используя приведенный ниже код, я смог извлечь текст каждого сообщения электронной почты, которое я пробовал.Я также протестировал модуль gensim, и он работал правильно.
import email
from gensim.summarization import summarize, keywords
with open('email_input.txt', 'r') as input:
email_body = ''
raw_message = input.read()
# Return a message object structure from a string
msg = email.message_from_string(raw_message)
# iterate over all the parts and subparts of a message object tree
for part in msg.walk():
# Return the message’s content type.
if part.get_content_type() == 'text/plain':
email_body = part.get_payload()
summary = summarize(email_body, ratio=0.10)
print(summary)
kw = keywords(email_body, words=15)
print(kw)
ФИНАЛЬНЫЙ ОТВЕТ
Это мой окончательный ответ на этот вопрос.Надеюсь, один из этих 4 ответов соответствует вашим требованиям.
Вы должны будете сделать небольшую очистку вывода, потому что я не знаю всех ваших требований.
with open('email_input.txt') as infile:
# Boolean state variable to keep track of whether we want to be printing lines or not
lines_to_keep = False
for line in infile:
# Look for lines that start with a greeting
if line.startswith("Dear"):
# set lines_to_keep true and start capturing lines
lines_to_keep = True
# Look for lines that start with a salutation
elif line.startswith("Regards") or line.startswith("Kind regards"):
# set lines_to_keep false and stop capturing lines
lines_to_keep = False
if lines_to_keep:
greeting_component = re.compile(r'(Dear.*)', re.IGNORECASE)
remove_greeting = re.match(greeting_component, line)
if not remove_greeting:
print (line.rstrip('\n'))
# output
The option-2 is fine. By the way, we had received in the past Letter of Authorization for many companies other than Spa and I guess Xxxx does not do bANNiness with them either. If yes, then need to submit withdrawal of Letter of Authorization for those companies and send a Letter of Authorization for spa. stating for any applications submitted. We will send an administrative filing issue letter for both the holder and the agent.
more here....