2

たとえば、文字列を識別したい:

a = 'KI83949 anythingHere 900.00 1 900.00'

文字列は次の 3 つの部分で構成されます。

index part is the string before the first space 
- 'KI83949'

これは何でもかまいませんが、ほとんどの場合、文字 + 数字です。

string between a[0] and the first floating number 
with two decimal points is the seconde part
-'anything here'

それは何でもかまいません

starting with the 2-decimal-point floating number is the last part
-'900.00 1 900.00'

することができます

'900.00' or '900.00 1 1003.00' or '900.00 100.00'
float or float+int+float or float+float 

ここの数字が変わります。文字列全体の場合、数値部分は常に存在しますが、前の 2 つの部分は存在しない場合があります。上記の機能を持つ文字列を他の何千もの文字列から除外しようとしています。これを表現するためにいくつかの方法を試しましたが、それでも失敗しました。正規表現の知識が乏しく申し訳ありません。最も近いショットは次のとおりです。

'.*\s?[\d.]+(\s\d)?[\s\d.]+$'

ただし、「TS90190」または「80 thda 4318」のようなものが返されます。これに何時間も費やした後、今では私を夢中にさせています. 誰かがそれを手伝ってくれますか?

4

1 に答える 1

2

.*貪欲—可能な限り、つまり最初の単語よりも多く一致しようとします。これが、おそらく予期しない結果が得られる主な理由です。まず、クエスチョン マークを追加することで貪欲にならないよう .*?にすることができます。

ただし、より厳密な方法は、スペース以外の文字のみを照合して開始することです。

^[^\s]+

先頭のはアンカー^と呼ばれ、一致が文字列 (または複数行モードの行) の先頭から始まることを表明します。

次に何があるか見てみましょう。最初のフロートまで合わせたいですよね?なんらかの貪欲でない量指定子が必要なようですね!

^[^\s]+\s+(.*?)\d+\.\d\d

上記は特定の状況下でバグが発生する可能性があり、現在のレベルで説明するには少し複雑すぎる可能性があります。ただし、言語または実装が先読みアサーションをサポートしていることがわかっている場合、これはより堅牢になります。

^[^\s]+\s+(.(?!\d+\.\d\d))+

これが行っていることは、float (の先読みアサーションと呼ばれる部分) が後に続かない.限り、すべての文字を照合することです。

于 2013-10-24T06:25:51.533 に答える