真 もわ爛漫

しゃーら、しゃーらしゃーら

1234567 を 1,234,567 にする正規表現をPythonで書こうとしたら不思議な目に遭った

#!/usr/bin/python2.4

import sys
import re

RE_COMMA = re.compile(r'^([-+]?\d+)(\d{3})')

def comma(n):
  while True:
    m = RE_COMMA.match(n)
    if not m:
      break
    n = '%s,%s' % (m.group(1), m.group(2))
  return n

for n in sys.argv[1:]:
  if n.isdigit():
    print n, "->", comma(n)
  else:
    print "%s is not num\n" % n

結果

> ./num_comma_exp.py 1234567
1234567 -> 1,234
> ./num_comma_exp.py 12345678
12345678 -> 12,345
> ./num_comma_exp.py 123456789
123456789 -> 123,456 

"+" が greedy にマッチさせてくるんだったらこの結果はおかしくないか?

ちなみに irb (ruby) だとこうなる

> "12345678".sub(/^([-+]?\d+)(\d{3})/, '\1,\2')
=> "12345,678

しかたないので "RE_COMMA = re.compile(r'^([-+]?\d+)(\d{3})(.*?)$')" などとしてみたらうまく動いた。