Парсинг “От” адресов из почтового текста

  1. Это происходит потому, что «Enter» пытается отправить форму.

  2. Перенос вашего кода в обработчик событий onSubmit может исправить проблему без удаления тега формы.

Я приложил фрагмент. Дайте мне знать, если это то, что вы ожидаете.

<form onSubmit="changeToHello(event)">
    <div>
        <input type ="text" id="myInput"/>
    </div>
</form>
<script>
function changeToHello(event) {
  event.preventDefault();
  var input = document.getElementById("myInput");
  input.value ="Hello";
}
</script>

14
задан Jay 15 February 2009 в 00:54
поделиться

8 ответов

Если Ваша цель состоит в том, чтобы на самом деле извлечь адреса электронной почты из текста, необходимо пользоваться библиотекой, созданной с этой целью. Регулярные выражения не хорошо подходят соответствовать произвольным адресам электронной почты.

Но если бы Вы делаете это как осуществление для понимания регулярных выражений лучше, я проявил бы подход расширения выражения, которое Вы используете для включения дополнительного текста, которому Вы хотите соответствовать. Таким образом, сначала позвольте мне объяснить, что это делает regex:

[\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4}
  • [\w\-] соответствия любой символ "слова" (буква, число или подчеркивание), или дефис
  • [\w\-\.]+ соответствия (любой словесный символ или дефис или период) один или несколько раз
  • @ соответствует литералу
  • [\w\-] соответствия любой словесный символ или дефис
  • [\w\-\.]+ соответствия (любой словесный символ или дефис или период) один или несколько раз
  • [a-zA-Z]{1,4} соответствия 1, 2, 3, или 4 строчных или прописных буквы

Таким образом, это соответствует последовательности "слова", которое может содержать дефисы или периоды, но не запускается с периода, сопровождаемого @ знак, сопровождаемый другим "словом" (тот же смысл как прежде), который заканчивается буквой.

Теперь, для изменения этого в целях давайте добавим regex части для соответствия "От", имя и угловые скобки:

From: [\w\s]+?<([\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4})>
  • From: соответствует буквенному тексту "От:"
  • [\w\s]+? соответствия один или несколько последовательных словесных символов или пробелов. Вопросительный знак делает соответствие нежадным, таким образом, это будет соответствовать как можно меньшему количеству символов, все еще позволяя целому регулярному выражению соответствовать (в этом случае, это, вероятно, не необходимо, но это действительно делает соответствие более эффективным, так как вещью, которая прибывает сразу впоследствии, не является словесный символ или пробел).
  • < соответствует литералу, меньше подписываются (открывающая угловая скобка)
  • То же регулярное выражение, которое Вы имели прежде, теперь окружается круглыми скобками. Это делает это группой фиксации, таким образом, можно звонить m.group(1) соответствовать тексту той частью regex.
  • > соответствует больше литералу - чем знак

Так как regex теперь использует группы фиксации, Ваш код должен будет измениться немного также:

import re
foundemail = []

mailsrch = re.compile(r'From: [\w\s]+?<([\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4})>')

for line in open("text.txt"):
    foundemail.extend([m.group(1) for m in mailsrch.finditer(line)])

print foundemail

Код [m.group(1) for m in mailsrch.finditer(line)] производит список из первой группы фиксации (помните, это было частью в круглых скобках) от каждого соответствия, найденного регулярным выражением.

3
ответ дан 1 December 2019 в 06:11
поделиться

Испытайте это:

>>> from email.utils import parseaddr

>>> parseaddr('From: vg@m.com')
('', 'vg@m.com')

>>> parseaddr('From: Van Gale <vg@m.com>')
('Van Gale', 'vg@m.com')

>>> parseaddr('    From: Van Gale <vg@m.com>   ')
('Van Gale', 'vg@m.com')

>>> parseaddr('blah abdf    From: Van Gale <vg@m.com>   and this')
('Van Gale', 'vg@m.com')

К сожалению, это только находит первую электронную почту в каждой строке, потому что это ожидает строки заголовка, но возможно это в порядке?

36
ответ дан 1 December 2019 в 06:11
поделиться
import email
msg = email.message_from_string(str)

# or
# f = open(file)
# msg = email.message_from_file(f)

msg['from']

# and optionally
from email.utils import parseaddr
addr = parseaddr(msg['from'])
9
ответ дан 1 December 2019 в 06:11
поделиться

Используйте электронную почту и пакеты почтового ящика для парсинга версии простого текста электронной почты. Это преобразует его в объект, который включит для извлечения всех адресов в поле 'From'.

Можно также сделать большой другой анализ сообщения, если необходимо обработать другие поля заголовка или тело сообщения.

Как быстрый пример, следующий (непротестированный) код должен прочитать все сообщение в почтовом ящике стиля Unix и распечатать весь 'от' заголовков.

import mailbox
import email

mbox = mailbox.PortableUnixMailbox(open(filename, 'rU'), email.message_from_file)

for msg in mbox:
   from = msg['From']
   print from
2
ответ дан 1 December 2019 в 06:11
поделиться

Примерно разговор, Вы можете:

from email.utils import parseaddr

foundemail = []
for line in open("text.txt"):
    if not line.startswith("From:"): continue
    n, e = parseaddr(line)
    foundemail.append(e)
print foundemail

Это использует встроенный Python parseaddr функция для парсинга адреса из от строки (как продемонстрировано другими ответами) без издержек обязательно парсинга всего сообщения (например, при помощи более полнофункциональной электронной почты и пакетов почтового ящика). Сценарий здесь просто пропускает любые строки, которые не начинаются "От":. зависят ли служебные вопросы Вам от того, насколько большой Ваш вход и как часто Вы будете делать эту операцию.

1
ответ дан 1 December 2019 в 06:11
поделиться

если можно быть довольно уверены, что строки, содержащие эти адреса электронной почты, запускаются с пробела, сопровождаемого "От": можно просто сделать это:

addresslines = []
for line in open("text.txt"):
    if line.strip().startswith("From:"):
        addresslines.append(line)

затем позже - или при добавлении их к списку - можно совершенствовать addresslines объекты для выделения точно, что Вы хотите

0
ответ дан 1 December 2019 в 06:11
поделиться

"[материал] [материал] [stuff1-4 буквы]" о праве, но если бы Вы хотели Вам, то мог бы декодировать регулярное выражение с помощью приема, который я просто узнал о, здесь. Сделайте компиляцию () на интерактивной сессии Python как это:

mailsrch = re.compile(r'[\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4}', 128)

Это распечатает следующее:

in 
  category category_word
  literal 45
max_repeat 1 65535 
  in 
    category category_word
    literal 45
    literal 46
literal 64 
in 
  category category_word
  literal 45
max_repeat 1 65535 
  in 
    category category_word
    literal 45
    literal 46
max_repeat 1 4 
  in 
    range (97, 122)
    range (65, 90)

Который, если можно отчасти привыкнуть к нему, показывает Вам точно, как РЕ работает.

0
ответ дан 1 December 2019 в 06:11
поделиться
mailsrch = re.compile(r'[\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4}')

Разбивка выражения:

[\w-]: любой словесный символ (алфавитно-цифровой, плюс подчеркивание) или тире

[\w-.]+: любой словесный символ, тире, или период/точка, один или несколько раз

@: литерал символ

[\w-][\w-.]+: любой символ слова или тире, сопровождаемый любым символом слова, тире, или период один или несколько раз.

[a-zA-Z]{1,4}: любые времена буквенного символа 1-4.

Сделать это соответствие только строками, запускающимися с From:, и перенесенный в <и> символы:

import re

foundemail = []
mailsrch = re.compile(r'^From:\s+.*<([\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4})>', re.I | re.M)
foundemail.extend(mailsrch.findall(open('text.txt').read()))

print foundemail
2
ответ дан 1 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: