Это происходит потому, что «Enter» пытается отправить форму.
Перенос вашего кода в обработчик событий 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>
Если Ваша цель состоит в том, чтобы на самом деле извлечь адреса электронной почты из текста, необходимо пользоваться библиотекой, созданной с этой целью. Регулярные выражения не хорошо подходят соответствовать произвольным адресам электронной почты.
Но если бы Вы делаете это как осуществление для понимания регулярных выражений лучше, я проявил бы подход расширения выражения, которое Вы используете для включения дополнительного текста, которому Вы хотите соответствовать. Таким образом, сначала позвольте мне объяснить, что это делает 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)]
производит список из первой группы фиксации (помните, это было частью в круглых скобках) от каждого соответствия, найденного регулярным выражением.
Испытайте это:
>>> 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')
К сожалению, это только находит первую электронную почту в каждой строке, потому что это ожидает строки заголовка, но возможно это в порядке?
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'])
Используйте электронную почту и пакеты почтового ящика для парсинга версии простого текста электронной почты. Это преобразует его в объект, который включит для извлечения всех адресов в поле '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
Примерно разговор, Вы можете:
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 функция для парсинга адреса из от строки (как продемонстрировано другими ответами) без издержек обязательно парсинга всего сообщения (например, при помощи более полнофункциональной электронной почты и пакетов почтового ящика). Сценарий здесь просто пропускает любые строки, которые не начинаются "От":. зависят ли служебные вопросы Вам от того, насколько большой Ваш вход и как часто Вы будете делать эту операцию.
если можно быть довольно уверены, что строки, содержащие эти адреса электронной почты, запускаются с пробела, сопровождаемого "От": можно просто сделать это:
addresslines = []
for line in open("text.txt"):
if line.strip().startswith("From:"):
addresslines.append(line)
затем позже - или при добавлении их к списку - можно совершенствовать addresslines объекты для выделения точно, что Вы хотите
"[материал] [материал] [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)
Который, если можно отчасти привыкнуть к нему, показывает Вам точно, как РЕ работает.
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