Contest Solution: Super Freq
The variable names c, d, and e are too cryptic.  (f is fine, because it's a customary variable for a file.  In my solution below, I use c consistently for characters during iteration, which is also acceptable.)

Why do you normalize the case using line.lower(), when the sample output suggests that uppercase output is preferred?

In my opinion, the regular expression is overkill here.

The challenge is ambiguous as to what exactly constitutes "15% in a given passage of text".  Does the denominator include the spaces and punctuation?  That's debatable.  Should the denominator include the trailing newline?  Probably not, but you should be aware that you did.

Personally, I'd prefer to collect all of the super freqs using a list comprehension, instead of checking for the if (c == 0): … case.  In any case, there shouldn't be parentheses there in standard Python style.

from collections import Counter

with open('prob2.in') as f:
    for line in f:
        counts = Counter(c for c in line.upper() if 'A' &lt;= c &lt;= 'Z')
        super_freqs = [c for c, n in counts.items() if n / len(line) &gt; 0.15]
        if not super_freqs:
            print('There are no super freqs.')
        else:
            for c in super_freqs:
                print('{0} is a super freq.'.format(c))