三桁ごとに空白を入れる

食事を挟んで二時間ほど考えたけど、少なくとも 2.4 の manual に書いてある範囲で、re.sub() を使ったままでは不可能と結論。理由はこんな感じ。

仮定

;; 勝手に引数を re.sub(pattern, template, input) と命名

  1. re.sub() の template は \N 以外全部定数である。動的に生成できる部分は全て置換前の input に含まれなければならない。
  2. 既に消費された部分がどうであったかについて言及する方法は存在しない (そもそも「消費」の概念は re.sub() の物なのに「言及」は pattern の概念だから)
  3. input に含まれる先頭以外の各文字は、被置換部に含まれる (消費される) xor 次の repetition でも検索対象にされる

二つ目が非常に大きな if ですが。

疑似証明

(1) 空白を挿入することがあるならば、input に空白が含まれない事と仮定 1 により、置換の度にどこかに空白を挿入する事になる。
input = "1.234567" と仮定する。正しい regex はこれに手を加えず返さなくてはならない。
(2) regex は "1.234567" を、a) 全部又は一部を消費する xor b) 一文字も消費せず reject するしかない。a) をとった場合、(1) により余分な空白がどこかに挿入されるから、正しい regex は b) の動作をする。このとき、".234567" は consume されないから、仮定 3 により、".234567" が二回目の match にかけられる。同様に reject するしかなくて "234567" がかけられる。要するに正しい regex に input = "1.234567" を渡すと、必ずいつか "234567" が出現する。
(3) "1.234567" の "234567" が渡されたとき、それを "9234567" の "234567" と区別する手段は存在しない。するなら仮定 2 に反する。したがって、(1) により re.sub() は "1.234567" と "9234567" の両方に空白を挿入するかさもなくばどちらにも挿入しない (234 の後には)。これは仕様に反する。よって re.sub() で仕様を満たすことはできない。

多分、…ね。まあときどき(いつも?) guru ≒ god なので、何が飛び出すかわかりませんが。