I would like to get a list of all possible keyword arguments a string template might use in a substitution.
Is there a way to do this other than re?
If it's okay to use string.format, consider using built-in class string.Formatter which has a parse() method:
string.format
string.Formatter
parse()
>>> from string import Formatter >>> [i[1] for i in Formatter().parse('Hello {1} {foo}') if i[1] is not None] ['1', 'foo']
See here for more details.