2016-07-29 3 views
1

1.05 * fとf * 1.05の両方を解析して、fが固定文字である数値と等しい正の浮動小数点数であり、*は常に 'f'と浮動小数点数(つまり乗算)の間にあることを意味します。乗算がない場合は、それもOKであり、文字列全体が「f」であるため、「1.05 *」はオプションです。 1.05 * f * 1.05は動作しません。 gf * 1.05は機能せず、f * 1.05fは中断します。commutative操作を理解する最も正規表現の方法は?

私はPythonを使用しています。私は実際には、f * 1.05fも動作するので、f * 1.05を動作させるのは苦労しています。オプションの乗算の最後にドル記号を付けて浮動させると、何も動作しません。 「|」

^f(\\*(\\d*[.])?\\d+)? # f*1.05 matches, but unfortunately so does f*1.05f 
^f((\\*(\\d*[.])?\\d+)?)$ # the $ makes f*1.05f not match, but f*1.05 doesn't match either! 

本当に私の質問には、使用しなくても一度に1.05 *のF、F、およびF * 1.05作業のすべてを作るための巧妙な方法があるかどうかについてです左または右のフロートの間で選択することができます。

+0

は、なぜあなたは論理和のための論理和演算子を使用したくないでしょうか? – L3viathan

+0

より一般的な式構文を解析しようとしていますか?それを行うための優れた技術がいくつかあります。 –

+0

コードはどこですか? – melpomene

答えて

-1

負の表情|救助に(先の背後にある)S:

pattern=r'((?!.*f\*)[\d.]+\*)?f((?<!\*f)\*[\d.]+)?' 

s="""1.05*f*1.05 
1.05*f 
f*1.05 
f""" 

for line in s.split("\n"): 
    if re.match(pattern, line): 
     print("yay") 
    else: 
     print("nay") 

プリント:

nay 
yay 
yay 
yay 

説明:パターンは2つのオプションのグループ(番号グループ)とで構成されてい中央のf。左のグループには、その前に負の先読みがあり、任意の文字列に続いて、fとアスタリスクが続きます。したがって、この先読みは、文字列のさらに下のfにアスタリスクが続く場合には一致しません。グループ全体はオプションです(?)。 fの後に同じことが繰り返されますが、今回は負のlookbehindを使用して、その直前の*fをチェックします。それが見つかった場合、グループは一致しません。これは再度オプションであるため、正規表現全体を破ることはありません。

私はまだあなたがそれを望む理由を理解していない、|は非常に優れています。上の複数行改質剤と

+0

はい...私は否定的なルックスの先読み/後ろが明らかに有用な機能であることを知っていましたが、それはかなり醜いです。 |私の3つの選択肢のオペレータは確かに読みやすく/保守が容易です。これは3つの 'f'、 'f * 1.1'、 '1.1 * f'の3つのケースにマッチしますが、 'ff'と 'ff * 1.1'にもマッチします。若干の修正を加えれば、うまくいかない試合を修正できるかもしれないが、満足している。 – FinanceGuyThatCantCode

+0

また、 '^(?!*?\ * f \ *)([\ d。] + \ *)?f(\ * [*])のように、 d。] +)?$ ' – L3viathan

+0

をクリアするには、私は|方法 - 他の方法が簡単にできる場合、少しの好奇心でした。 thx – FinanceGuyThatCantCode

1

^(?:f\*\d*\.\d+|\d*\.\d+\*f|f)$ 

Live demo

+0

はい - 私はそのような解決策を持っていましたが、文字列がXで始まり、Yで終わらず、文字列がYで終わっても開始しないと言う方法があるかどうか不思議でした。物事はほとんど役に立たずに本当に醜いです。 – FinanceGuyThatCantCode

関連する問題