使用正则表达式从邮件头中提取IP地址

1 投票
5 回答
1534 浏览
提问于 2025-04-30 13:35

我有个问题,我需要从电子邮件头部的以下部分提取IP地址。

Received: from smtprelay.b.mail.com (smtprelay0225.b.mail.com. [11.11.11.11])
    by mx.google.com with ESMTP id g7si12282480pat.225.2014.07.26.06.53.24
    for <a@gmail.com>;

我只想要输出11.11.11.11,想用Python中的正则表达式来实现。

如果有人能帮忙,我会非常感激。

谢谢。

暂无标签

5 个回答

0

在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能会在使用某个库或者框架时,发现它的功能和用法跟自己想的不太一样。这种情况很常见,特别是对于刚入门的朋友来说。

在这种情况下,最好的办法就是去查阅相关的文档,或者在网上搜索一下,看看有没有其他人遇到过类似的问题。很多时候,社区里的其他开发者会分享他们的经验和解决方案,这对我们理解和解决问题非常有帮助。

另外,写代码的时候,保持代码的整洁和可读性也很重要。这样不仅能帮助自己更好地理解代码,也能让其他人更容易地阅读和维护你的代码。

总之,遇到问题不要慌,慢慢查找资料,理解每个部分的功能,逐步解决问题,这样才能不断提高自己的编程水平。

>>> f=open("file")
>>> for line in f:
...   if "Received" in line:
...     print line.split("]")[0].split("[")[-1]
...
11.11.11.11
0

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在程序中使用这些数据。这个过程可能会涉及到很多步骤,比如连接到数据库、查询数据、处理数据等等。

如果你在使用某种编程语言,比如Python,可能会用到一些库来帮助你完成这些任务。库就像是工具箱,里面有很多现成的工具,可以让你更轻松地完成工作。

在处理数据时,可能会遇到一些错误,比如数据格式不对、连接失败等等。这些错误需要我们去调试,也就是找出问题所在并解决它。调试就像是侦探,帮助我们找到程序中的“罪犯”。

总之,处理数据是编程中很重要的一部分,掌握这些技能可以让你更有效地完成任务。

>>> import re
>>> a="""from smtprelay.b.mail.com (smtprelay0225.b.mail.com. [11.11.11.11])
...     by mx.google.com with ESMTP id g7si12282480pat.225.2014.07.26.06.53.24
...     for <a@gmail.com>;"""
>>> re.findall(r'\[(.*)\]',a)
['11.11.11.11']
1

看起来你想要获取那些在[]方括号里面的数据。

>>> import re
>>> s = """Received: from smtprelay.b.mail.com (smtprelay0225.b.mail.com. [11.11.11.11])
...     by mx.google.com with ESMTP id g7si12282480pat.225.2014.07.26.06.53.24
...     for <a@gmail.com>;"""
>>> re.search(r'(?<=\[)[^\[\]]*(?=\])', s).group()
'11.11.11.11'

或者

>>> re.findall(r'(?<![.\d])\b\d{1,3}(?:\.\d{1,3}){3}\b(?![.\d])', s)
['11.11.11.11']
1

使用这个正则表达式

(?<=\[)\d{1,3}(?:\.\d{1,3}){3}(?=\])

来提取IP地址

你可以看看这个正则表达式是怎么工作的:http://regex101.com/r/lI0rU3/1

x="""Received: from smtprelay.b.mail.com (smtprelay0225.b.mail.com. [11.11.11.11])
...     by mx.google.com with ESMTP id g7si12282480pat.225.2014.07.26.06.53.24
...     for <a@gmail.com>;"""
>>> re.findall(r'(?<=\[)\d{1,3}(?:\.\d{1,3}){3}(?=\])', x)
['11.11.11.11']
2
(?<=\[)\d+(?:\.\d+){3}(?=\])

试试这个。使用 re.findall

import re
p = re.compile(ur'(?<=\[)\d+(?:\.\d+){3}(?=\])')
test_str = u"Received: from smtprelay.b.mail.com (smtprelay0225.b.mail.com. [11.11.11.11])\n by mx.google.com with ESMTP id g7si12282480pat.225.2014.07.26.06.53.24\n for <a@gmail.com>;"

re.findall(p, test_str)

看看这个演示。

http://regex101.com/r/gT6kI4/10

撰写回答