import re


def separate_punctuation(s, all_but=['\''], sep=' '):
    """Separates, but does not remove punctuation, with whitespace (single space by default)."""
    punc_chars = '[!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~]'
    sep_chars = punc_chars
    for char in all_but:
        sep_chars = sep_chars.replace(char, '')
    remaining = s
    processed = []
    while remaining:
        groups = re.findall(re.compile('(.*?)(' + sep_chars + ')(.*)', re.DOTALL), remaining)
        if groups:
            groups = groups[0]
            processed.extend([groups[0].strip(), groups[1].strip()])
            remaining = groups[2].strip()
        else:
            processed.append(remaining.strip())
            remaining = ''
        
    return sep.join(processed)