条件式(b>=48,b<=57)は真のとき1、偽のとき0という値になります。
これは、&や|でさらにふるいにかけても変わりません。
つまり、!1 は !(真である)という意味で「真ではない」という意味です。
計算は×、÷を+、−より先に計算する要領で
!や=の方が&や|より先に計算されます。
b>=48 かつ b<=57が真ではない
つまり
b>=48 かつ b>57となるので、最終的にb>57とまとめられてしまいます。
試してみると分かるのですがb<48の部分にある#などが弾けていません。
正しくは
if ((b>=48)&(b<=57))!1 :frg=1 :break
です。
こうすれば
(b>=48 かつ b<=57)が真でない
つまり
bが48(=「0」)から57(=「9」)の範囲内にない
ということになります。
以下は余談になりますので、暇なときにでも読んでいただければ幸いです。
実際には0のとき偽で、それ以外のとき真となるため、
!1は必ずしも「真ではない」すなわち「偽である」を意味するとは限りません。
今回は条件式と論理積(&のことです)だけなので全く問題はないのですが。
私はそのときに分かりやすい書き方をすれば良いという考えなのですが、
「!1は使うべきではない。=0にすべきだ」という考えの方もいらっしゃいます。
実際に!1を使うべきでない場合もあるので頭の片隅に入れておくといいと思います。
プラグインやモジュールなど他のプログラマーが使うための
プログラムを書くときまではその場面がくることはないとおもいますが…。