Python Regex Match子字符串

时间:2018-10-08 02:19:03

标签: python regex

我有以下字符串:

spf=pass (sender IP is 198.71.245.6) smtp.mailfrom=bounces.em.godaddy.com; domainname.com.au; dkim=pass (signature was verified) header.d=godaddy.com;domainname.com.au; dmarc=pass action=none header.from=godaddy.com;

使用以下代码:

if "Authentication-Results" in n:
    auth_results = n['Authentication-Results']
    print(auth_results)

    spf = re.match(r"spf=(\w+)", auth_results)
    if spf:
       spf_result = spf.group(1)

    dkim = re.match(r"^.*dkim=(\w+)", auth_results)
    print(dkim)
    if dkim:
        dkim_result = dkim.group(1)

SPF始终匹配,但DKIM不匹配:

print(dkim) = None

根据在线正则表达式测试仪,它应该:https://regex101.com/r/ZkVg74/1为什么不是这样的任何想法,我也尝试过这些:

dkim = re.match(r"dkim=(\w+)", auth_results) dkim = re.match(r"^.*dkim=(\w+)", auth_results, re.MULTILINE)

2 个答案:

答案 0 :(得分:1)

.默认不与换行符匹配。由于测试字符串中的dkim位于第二行,并且您的正则表达式模式尝试使用^.*来匹配字符串开头的所有非换行字符,因此找不到dkim在第二行。您应该使用re.DOTALL标志来允许.匹配换行符:

dkim = re.match(r"^.*dkim=(\w+)", auth_results, flags=re.DOTALL)

或从字符串的开头完全删除不必要的匹配项:

dkim = re.search(r"dkim=(\w+)", auth_results)

答案 1 :(得分:0)

首先,re.match从头开始工作。因此您的r"dkim=(\w+)"试用版无效。

第二,.符号与换行符以外的字符匹配。如果需要,则应使用re.Sre.DOTALL标志强制使用它。

此外,您可以使用[\s\S][\w\W]来匹配任何字符。

尝试一下:
re.match(r"^[\s\S]*dkim=(\w+)", auth_results).group(1)
或这样:
re.match(r"^.*dkim=(\w+)", auth_results, re.DOTALL).group(1)