【问题标题】:python regex: inverse match at the end of the linepython 正则表达式:行尾的反向匹配
【发布时间】:2021-01-14 08:11:47
【问题描述】:

我正在使用正则表达式来匹配我的日志中的模式。我需要在开始时匹配模式,然后反转匹配,即:

我需要匹配这一行:

reject: RCPT from unknown[165.231.143.153]: 450 4.7.25 from=<spameri@tiscali.it> to=<spameri@tiscali.it>

但不是这一行:

reject: RCPT from unknown[165.231.143.153]: 450 4.7.25 from=<spameri@tiscali.it> to=<alice@mydomain.com>

基本上,如果该行包含to=&lt;alice@mydomain.com&gt;(或任何其他带有mydomain.com 的电子邮件地址,那么它不应该触发匹配。否则,如果它是其他任何东西,即to=&lt;bob@otherdomain.com&gt;to=&lt;alice@thirddomain.com&gt;,那么它应该匹配。

我尝试使用这种消极的前瞻性模式:

'^reject: RCPT from [A-Za-z0-9\.-]+\[{ip}\]: .* to=<[A-Za-z0-9\._-]+@(?!mydomain.com)>',

我在哪里使用构造 (?!mydomain.com) 来否定 mydomain.com

我该怎么做?

【问题讨论】:

    标签: python regex regex-negation


    【解决方案1】:

    前瞻是非消耗性的,即正则表达式索引保持在原来的位置,匹配的模式不会添加到整体匹配值中。

    因此,(?!mydomain.com)&gt; 中的(?!mydomain.com) 检查当前位置右侧是否有mydomain、任何字符、com,因为下一个字符必须是&gt;,所以它总是真的。

    您需要在&gt; 之前使用char,因此您可以使用

    ^reject: RCPT from [A-Za-z0-9.-]+\[{ip}]: .* to=<[A-Za-z0-9._-]+@(?!mydomain\.com>)[^>]*>
    

    请注意,您不需要在方括号(又名字符类)内转义 .,并且当它不在字符类内时,您不需要转义 ]

    @(?!mydomain\.com&gt;)[^&gt;]*&gt; 匹配

    • @ - 一个 @ 字符
    • (?!mydomain\.com&gt;) - 不紧跟mydomain.com&gt;
    • [^&gt;]* - (否定字符类匹配)除&gt; 之外的任何零个或多个字符
    • &gt; - &gt; 字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多