У меня есть следующая строка:

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)

1
Lee Stevens 8 Окт 2018 в 05:19

2 ответа

Лучший ответ

. не соответствует символу новой строки по умолчанию. Так как dkim в вашей тестовой строке находится на второй строке, и ваш шаблон регулярного выражения пытается сопоставить любой не-символ новой строки в начале строки с ^.*, он не найдет dkim на второй линии. Вы должны либо использовать флаг re.DOTALL, чтобы . соответствовал символу новой строки:

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

Или удалите ненужное совпадение из начала строки:

dkim = re.search(r"dkim=(\w+)", auth_results)
1
blhsing 8 Окт 2018 в 02:42

Сначала re.match работает с самого начала. так что ваша пробная версия r"dkim=(\w+)" не работает.

Во-вторых, символ . соответствует символам, кроме символа новой строки. Если вы этого хотите, вы должны явно заставить его использовать re.S или re.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)

0
lincr 8 Окт 2018 в 02:41