次の点を考慮してください。
>>> import re
>>> a = "first:second"
>>> re.findall("[^:]*", a)
['first', '', 'second', '']
>>> re.sub("[^:]*", r"(\g<0>)", a)
'(first):(second)'
re.sub()の動作は最初はより理にかなっていますが、re.findall()の動作も理解できます。結局のところ、 コロン以外の文字のみで構成されるfirstとの間の空の文字列 (正確にはゼロ) に一致させることができますが、同じように動作しないのはなぜでしょうか?:re.sub()
最後のコマンドの結果は(first)():(second)()?