Almost there, but I've found a couple of holes with my regex to turn CamelCase into Spaced Sentence Case. It does well on most cases (pun intended), but it's getting hung up on the first hyphenated word. I can't figure out why.
import re
# ---------------------------------------------------------
def camelCaseToSpacedTitleCase(u):
# add spaces
regex = re.sub("(.)([A-Z][a-z-]+)", r"\1 \2", u)
# make title case
regex = re.sub("([a-z0-9])([A-Z])", r"\1 \2", regex)
# keep CAPITALISED words
regex = re.sub("(^|\s)(\S)", r"\1" + r"\2".upper(), regex)
# keep Mc and Mac
regex = re.sub("(Mc|Mac)(\s)", r"\1", regex)
# keep digits
regex = re.sub("([a-z]+)([0-9]+\s)", r"\1 \2", regex)
# keep I or A
regex = re.sub("(\sA|\sI)([A-Z])([a-z]*)", r"\1 \2\3", regex)
# remove double whitespaces
regex = re.sub("\s{2,32}", r" ", regex)
return regex
test1 = "TheAmazingSpider-Man"
test2 = "WeAreSexBob-Omb"
test3 = "SR-128 SomethingSomething"
test4 = "Ex-Voto - Monitor"
test5 = "FergusMcNeilEyeContact"
test6 = "It'sABanana"
test7 = "HouseOf1000Zombies!"
print (camelCaseToSpacedTitleCase(test1))
print (camelCaseToSpacedTitleCase(test2))
print (camelCaseToSpacedTitleCase(test3))
print (camelCaseToSpacedTitleCase(test4))
print (camelCaseToSpacedTitleCase(test5))
print (camelCaseToSpacedTitleCase(test6))
print (camelCaseToSpacedTitleCase(test7))
I would expect to see
"The Amazing Spider-Man"
"We Are Sex Bob-Omb"
"SR-128 Something Something"
"Ex-Voto - Monitor"
"Fergus McNeil Eye Contact"
"It's A Banana"
"House Of 1000 Zombies!"
I want to avoid using .titlecase() for the reasons above