次のような時間リテラルを含むpyLR1を使用して、カスタム記述言語のレクサールールを作成しています。
10h30m # meaning 10 hours + 30 minutes
5m30s # meaning 5 minutes + 30 seconds
10h20m15s # meaning 10 hours + 20 minutes + 15 seconds
15.6s # meaning 15.6 seconds
時・分・秒の指定順は、、、、固定h
とm
するs
。これを詳細に指定するには、次の有効な組み合わせが必要ですhms
、hm
、h
、ms
、m
およびs
(もちろん、異なるセグメント間には数字が入ります)。おまけとして、正規表現はセグメント内の 10 進数 (つまり、非自然数) をチェックし、重要度が最も低いセグメントでのみこれらを許可する必要があります。
したがって、最後のグループを除くすべてのグループに対して、次のような数字の一致があります。
([0-9]+)
そして、最後のグループについても:
([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?) # to allow for .5 and 0.5 and 5.0 and 5
h、m、sa のすべての組み合わせを調べると、かわいい小さな python スクリプトで次の正規表現が得られます。
(([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?)h|([0-9]+)h([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?)m|([0-9]+)h([0-9]+)m([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?)s|([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?)m|([0-9]+)m([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?)s|([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?)s)
明らかに、これはちょっとしたホラー表現です。これを簡単にする方法はありますか?回答は pythons モジュールで機能する必要があり、正規表現のサブセットが制限されているためにre
機能しない回答も受け入れます。pyLR1