2006-03-03

_ 三桁毎にスペースを挿入する正規表現の続き

結局「他で余計な処理を加えず」「一つだけで」という条件だと、 znzさんのアイデア が最適なんですけど、 バグがあるんですよ、これだと。

>>> re.sub('(\\d{1,3})(?=(\\d{3})+(\\.\\d*)?$)(\\d{3}(\\.\\d*)|)', '\\1 \\4', '1.12345')
'1.12 345'

じゃあ、これを解決できるかというと、 私にはさっぱり良い考えが浮かびません。 変な所にスペースが入る方法なら私も考えたんですけど、 それはちょっと。

というわけで、結局駄目っぽいということで。

ちなみに、正規表現でしこたま頭を悩ませた後で申し訳ないのですが、 Pythonだと適当に書いた方が五倍は速いです。 使ったスクリプトは以下の通り。

import re

rexp_fp = re.compile('(\\d{1,3})(?=(\\d{3})+\\.)')
rexp_d = re.compile('(\\d{1,3})(?=(\\d{3})+$)')

def convert(s):
  if '.' in s:
    return rexp_fp.sub('\\1 ', s)
  else:
    return rexp_d.sub('\\1 ', s)

def test():
  assert convert('1234567890.12345') == '1 234 567 890.12345'
  assert convert('1234567890') == '1 234 567 890'
  assert convert('1.12345') == '1.12345'


if __name__=='__main__':
  from timeit import Timer
  import re
  t = Timer("test()", "from __main__ import test")
  print t.timeit(10000)
def convert(s):
  a = s.split('.')
  t = a[0]
  b = []
  while len(t) > 3:
    b.append(t[-3:])
    t = t[:-3]
  b.append(t)
  b.reverse()
  t = ' '.join(b)
  if len(a) == 1:
    return t
  else:
    a[0] = t
    return '.'.join(a)

def test():
  assert convert('1234567890.12345') == '1 234 567 890.12345'
  assert convert('1234567890') == '1 234 567 890'
  assert convert('1.12345') == '1.12345'


if __name__=='__main__':
  from timeit import Timer
  import re
  t = Timer("test()", "from __main__ import test")
  print t.timeit(10000)
本日のツッコミ(全2件) [ツッコミを入れる]
_ bksujqzhv vyqxphsme (2007-03-07 09:10)

clfyejpsz rvsijo qhmicgkdv sgxznlm xofn gfsnemq ecjlhobf

_ xwbl lwqafnm (2007-03-07 09:11)

nakjumy ipxjeqrwb jbiqnazt qcaiv vozcipbf szkjg riwehbf http://www.jwkv.wvetz.com

[]

トップ «前の日記(2006-02-28) 最新 次の日記(2006-04-01)»