Разбор электронной почты и получение номера от тела - PullRequest
1 голос
/ 30 ноября 2011

Я хочу извлечь первый номер, найденный в теле письма.С помощью библиотеки электронной почты я извлек из тела письма только строку.Но проблема в том, что перед тем, как начинается настоящее текстовое тело, есть некоторая информация о кодировке и тому подобном (она содержит цифры).Как я могу пропустить их надежным способом, который не зависит от того, какой клиент создал электронную почту, и просто получить первый номер.

Если я наберу

match = re.search('\d+', string, re.MULTILINE)

, он получитпервое совпадение в информации о кодировке или чем-то другом, а не в реальном содержимом почты.

Хорошо.Я добавляю образец.Вот как это может выглядеть (я извлеку 123).Но я полагаю, что он может выглядеть иначе, отправленный другим клиентом.

--14dae93404410f62f404b2e65e10
Content-Type: text/plain; charset=ISO-8859-1

Junk 123 Junk

--14dae93404410f62f404b2e65e10
Content-Type: text/html; charset=ISO-8859-1

<p>Junk 123 Junk</p>

--14dae93404410f62f404b2e65e10--

Обновление: Теперь я застрял с итератором: - / Я действительно пытался.Но я не понимаю.Этот код:

msg = email.message_from_string(raw_message)
for part in email.iterators.typed_subpart_iterator(msg, 'text', 'plain'):
    print part

выводит:

--14dae93404410f62f404b2e65e10
Content-Type: text/plain; charset=ISO-8859-1

Junk 123 Junk

--14dae93404410f62f404b2e65e10
Content-Type: text/html; charset=ISO-8859-1

<p>Junk 123 Junk</p>

--14dae93404410f62f404b2e65e10--

Почему он просто не выведет:

Junk 123 Junk

?

Ответы [ 2 ]

6 голосов
/ 30 ноября 2011

Возможно, вы захотите использовать итераторы для пропуска заголовков подразделов.

http://docs.python.org/library/email.iterators.html#module-email.iterators

В этом примере будет напечатано тело каждой части сообщения с текстом / plain:

for part in email.iterators.typed_subpart_iterator(msg, 'text', 'plain'):
   for body_line in email.iterators.body_line_iterator(part):
       print body_line
0 голосов
/ 30 ноября 2011

Вы можете использовать это:

match = re.search(r"Content-Type:.*?[\n\r]+\D*(\d+)", subject)
if match:
    result = match.group(1)

Пояснение:

"
Content-Type:    # Match the characters “Content-Type:” literally
.                # Match any single character that is not a line break character
   *?               # Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
[\n\r]           # Match a single character present in the list below
                    # A line feed character
                    # A carriage return character
   +                # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
\D               # Match a single character that is not a digit 0..9
   *                # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
(                # Match the regular expression below and capture its match into backreference number 1
   \d               # Match a single digit 0..9
      +                # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...