【问题标题】:Regex: Tightening up an IPv4 regex to omit ESMTPSA id?正则表达式:收紧 IPv4 正则表达式以省略 ESMTPSA id?
【发布时间】:2015-08-26 10:53:40
【问题描述】:

ESMTPSA id 是一个类似于以下内容的字符串:

w12sm4743917pbs.68.2015.06.04.16.21.51

它可以出现在电子邮件中的 Received: from 标头中,例如以下示例:

Received: from [192.168.0.140] (n11649196059.netvigator.com. [116.49.196.59])
        by mx.google.com with ESMTPSA id w12sm4743917pbs.68.2015.06.04.16.21.51
        for <myemailaddress@gmail.com>
        (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
        Thu, 04 Jun 2015 16:21:52 -0700 (PDT)

我有以下正则表达式,可以很好地从此类标头中提取 IPv4 地址:

d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

问题是,它还提取了一部分 ESMTPSA id:015.06.04.16。亲身体验here

我们将如何收紧正则表达式以使其仅提取 IPv4 地址?注意:地址总是在方括号中,如上例所示。我正在使用 Python,并且我知道我可以使用 ipaddress 模块来验证所有匹配项,但首先不匹配对我来说会方便得多。

【问题讨论】:

    标签: regex ip-address ipv4


    【解决方案1】:
    [^\.\d]\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}[^\.\d]
    

    并从字符串的开头和结尾修剪 1 个符号(或使用捕获组)

    PS 或者干脆在我之后使用你的第一个正则表达式

    PS2带捕获组

    [^\.\d](\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[^\.\d]
    

    大多数正则表达式工具允许您按数字(按顺序)获取捕获组,如 \1 或类似

    【讨论】:

    • 它检查 ip 之前和之后不是数字而不是“。”
    • 我看到了您扩展正则表达式的逻辑,但它对我不起作用(您的原始版本和更新都不是):regex101.com/r/yP2rG2/1 当您说修剪一个符号时,符号是什么你指的是?
    • 此正则表达式将匹配 ip 之前的一个符号和 ip 之后的一个符号
    • 好的,因为它包含 IP 地址周围的方括号,这就是您从任一侧修剪一个字符的意思。
    • 你可以用两种方法解决这个问题:1)使用捕获组 2)在我的正则表达式的结果上启动你的初始正则表达式(有问题)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多