I don't know why that would make it un-pythonic since it is readable, simple, practical, and easy to implement/ explain without the assistance of code comments or knowledge of regex symbols/ functionalities. I say easier because we code for people, not machines and it may 'look' bad with the chaining, but it is easily understood by people at all skill levels vs trying to decipher regex expressions. ...A newbie might think that you are replacing [!+]. in the string at first glance and try to 'fix' it without looking at what the expression is doing.
To answer the 'what if I wanted to' question, (couldn't tell if you meant they are together or is a third character) add another replace. If you feel there are too many replaces being chained in your code, just add the character to a list and iterate over them:
charReplace = ['+', '!', '.', 'some']
inString = 'awesome this+ is a. Message!'
for chr in charReplace:
if chr in inString:
inString = inString.replace(chr, '-')
I do think that regex has a place and that was a nice, succinct re.sub example you provided and if it works, that is great- I personally think that regex can introduce complexity and over-complicate code so I use it sparingly when other methods would become too complex/complicated.