1. ホーム
  2. python

[解決済み] Pythonのatoi / atofに相当します。

2022-02-28 20:53:11

質問

Pythonは例外を発生させるのが好きで、通常、それは素晴らしいことです。例えば、atoi of "3 of 12", "3/12", "3 / 12" は全て3になるはずです。atof("3.14 seconds") は 3.14; atoi(" -99 score") は-99になるはずです。Pythonにはもちろんatoiとatof関数がありますが、これはatoiとatofのような振る舞いはせず、Pythonのintとfloatのコンストラクタと全く同じです。

これは本当に醜いもので、さまざまな float フォーマットに拡張するのは困難です。

value = 1
s = str(s).strip()
if s.startswith("-"):
    value = -1
    s = s[1:]
elif s.startswith("+"):
    s = s[1:]
try:
    mul = int("".join(itertools.takewhile(str.isdigit, s)))
except (TypeError, ValueError, AttributeError):
    mul = 0
return mul * value

解決方法は?

正規表現を使えば、かなり簡単にできますよ。

>>> import re
>>> p = re.compile(r'[^\d-]*(-?[\d]+(\.[\d]*)?([eE][+-]?[\d]+)?)')
>>> def test(seq):
        for s in seq:
            m = p.match(s)
            if m:
                result = m.groups()[0]
                if "." in result or "e" in result or "E" in result:
                    print "{0} -> {1}".format(s, float(result))
                else:
                    print '"{0}" -> {1}'.format(s, int(result))
            else:
                print s, "no match"

>>> test(s)
"1 0" -> 1
"3 of 12" -> 3
"3 1/2" -> 3
"3/12" -> 3
3.15 seconds -> 3.15
3.0E+102 -> 3e+102
"what about 2?" -> 2
"what about -2?" -> -2
2.10a -> 2.1