-1

小数点以下2桁が持てないという意味で、無効な浮動小数点数を検出するための正規表現を探しています。これが私が持っているものですが、機能していません:

REAL = re.compile("^\d+\.\d+$")

編集:私はPythonを使用しています。全体像では、C構文のミニチュアバージョンを認識するためのレクサーを書いています。2.3.4は無効として認識されますが、13.4.5は無効ではありません。それはそれと関係があると思います。


フォーマットが不十分な質問でごめんなさい。いくつかのコメントを読んだ後、コードの他の場所でエラーを見つけました。私のコードの前半で使用するre.compile("0") and re.compile("1")と、シーケンスの残りの部分に関係なく、1/0で始まるシーケンスが有効であると「ピックアップ」されていたことがわかりました。追加するだけ"0$" and "1$"で問題が解決しました。

4

2 に答える 2

2

より簡単な方法はこれを行うことです:

floatStr = '12.3.4'
try:
    float(floatStr)
except ValueError:
    # do something
    pass

つまり、文字列の解析を試みて、失敗した場合は、形式が浮動小数点数の形式ではないためです。ここで正規表現をいじる必要はありません (有効な浮動小数点数の形式を正しく理解するのは少し難しい場合があります)。標準の変換関数に面倒な作業を任せてください!

于 2013-03-22T20:33:56.430 に答える
1

あなたの問題は、実際にはこのコードにはまったくありません。

簡単なテストが示すように、withはと同じようREAL = re.compile("^\d+\.\d+$")に をre.match('13.4.5')返します。Nonere.match('2.3.4')

問題は、いくつかの以前のコードが'13.4.5'何らかの方法で一致し、トークンの残りを消費するか、残っているもの (たとえば'4.5') が有効なフロートになるように十分に消費することです。コードを見なければ、問題の正確な内容を推測することはできません。

しかし、結局のところ、ターミネータなしで一致する別の正規表現がある'1'ため、正規表現一致から語彙素を構築する必要があるコードはすべて'13.4.5'. 繰り返しますが、コードを見なければ、なぜそれが起こるのか正確に推測することはできません…</p>

于 2013-03-22T20:56:11.363 に答える