scanf()
は便利そうに見えて、実はそれほど便利ではありません。Cの標準関数は実装がしやすいかどうかで作られていった経緯があるため、使えないことは無いけど、そこまで実用的では無いという関数も多いです。そのうちの一つがscanf()
だと思います。そのため、後の言語では全く採用しないか、外部ライブラリでひっそり用意するかになっています。
さて、それはおいといて解決策です。考え方は二つです。改行まで全てを受け取るところまでは同じで、その後に分解するか、正規表現でマッチングさせるかで変わります。さらに必要なものに変換するという形です。それぞれについて書きたいと思います。なお、raw_input()
はPython3でなくなりinput()
を使うようになりました。下記のコードは全てPython3での動作を前提としています。
###フォーマットにあわせて分解し、それぞれを変換する。
Python
1# scanf("%d,%d,%d",&a,&b,&c);
2a, b, c = map(int, input().split(","))
3
4# scanf("%d\n%d\n%d",&a,&b,&c)
5a = int(input())
6b = int(input())
7c = int(input())
8
9# scanf("%[0123456789]" , str);
10from itertools import takewhile
11str = "".join(takewhile(lambda c: c in "0123456789", input()))
12
13# scanf("%[^\n]" , str);
14str = input()
それぞれがCのscanf()
と全く同じ訳では無い事に注意してください。3番目の例は後述の正規表現を使った方が簡単になると思います。
考え方は簡単です。始めにinput()
で1行全てを読み込んで文字列にしてしまいます。あとは、その文字列を加工していくだけです。split()
で分けたり、strip()
で余計な空白を削除したり、int()
やfloat()
で変換したりします。スペース区切りやカンマ区切りなどのデータであれば一番簡単でしょう。また、siplt()
で分けた後は、個別に処理ができますので、2番目は整数または文字列といった処理もできます。
###フォーマットに対する正規表現でマッチングさせる。
3番目の例だけは正規表現の方が良いだろうとのことでした。
Python
1# scanf("%[0123456789]" , str);
2import re
3m = re.match(r'\d*', input())
4str = m.group(0)
考えは先ほどとほぼ同じです。ただ、文字列の分解に正規表現を用いています。正規表現はscanf()
のフォーマットとは比べものにならないぐらいとても強力です。しかし、それだけで本が一冊書けるほどの奥の深さがあります。ですが、どんなに複雑なフォーマットでも正規表現を使うと表現が可能であり、ほとんどの場合は簡潔に書くことができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。