files = ["1card.txt", "card.txt" , "3card.txt", "52card.txt", "badcard.txt"]
def nat_sort(s):
    '''
    provides a sort mechanism for strings that may or 
    may not lead with an integer
    '''
    for i, c in enumerate(s):
        if not c.isdigit():
            break
    if not i:
        return 0, s
    else:
        return int(s[:i]), s[i:]
files.sort(key=nat_sort)
And now files is a sorted list:
['badcard.txt', 'card.txt', '1card.txt', '3card.txt', '52card.txt']
To sort keeping the similar letters together, do similarly to above:
def nat_sort(s):
    '''
    provides a sort mechanism for strings that may or 
    may not lead with an integer, but groups by strings 
    starting after integers, if any
    '''
    for i, c in enumerate(s):
        if not c.isdigit():
            break
    if not i:
        return s, 0
    else:
        return  s[i:], int(s[:i])
files.sort(key=nat_sort)
And now files returns:
['badcard.txt', 'card.txt', '1card.txt', '3card.txt', '52card.txt']