The restriction on the comment character is unfortunate, and, I think, unnecessary.

If the tail begins:

    r'(?P<tail>[^;#]*'

Then you don't need the strange comment restriction.  

You can can also simplify the regex and express the comment only once.

You can have an optional expression, rather than an or.

    r'\[\s*(?P<header>[^\s[\]:{}]+)\s*'    '(:[^#;]*)?'      ']\s*([#;].*)?$'

which makes me think we should also disallow '#' and ';' in variable names.

    r'\[\s*(?P<header>[^\s#[\]:;{}]+)\s*'    '(:[^#;]*)?'      ']\s*([#;].*)?$'