質問:
Python の正規表現モジュール ( re
) を使用して、一致したかどうか、または一致する可能性があるかどうかを判断するにはどうすればよいですか?
詳細:
単語の間に何があるかに関係なく、単語のパターンを正しい順序で検索する正規表現パターンが必要です。Yes
見つかったMaybe
場合、一致がまだ見つかった場合、または一致が見つからなかった場合に返す関数が必要No
です。パターン を探していますOne|....|Two|....|Three
。ここにいくつかの例を示します (名前、その数、または順序は重要ではないことに注意してください。私が気にするのは、 と の 3 つの単語だけOne
でTwo
ありThree
、その間にある許容される単語はJohn
、Malkovich
、Stamos
およびTravolta
です)。
はいを返します。
One|John|Malkovich|Two|John|Stamos|Three|John|Travolta
はいを返します。
One|John|Two|John|Three|John
はいを返します。
One|Two|Three
返品可能性があります:
One|Two
返品可能性があります:
One
いいえを返します:
Three|Two|One
例が完全ではないことを理解しているので、正規表現がYESになるために私が持っているものは次のとおりです。
if re.match('One\|(John\||Malkovich\||Stamos\||Travolta\|)*Two\|(John\||Malkovich\||Stamos\||Travolta\|)*Three\|(John\||Malkovich\||Stamos\||Travolta\|)*', 'One|John|Malkovich|Two|John|Stamos|Three|John|Travolta') != None
return 'Yes'
明らかに、パターンがThree|Two|One
上記の場合は失敗し、 を返すことができますNo
が、どうすればケースを確認できMaybe
ますか? 私はそのように括弧を入れ子にすることを考えました(注、テストされていません)
if re.match('One\|((John\||Malkovich\||Stamos\||Travolta\|)*Two(\|(John\||Malkovich\||Stamos\||Travolta\|)*Three\|(John\||Malkovich\||Stamos\||Travolta\|)*)*)*', 'One|John|Malkovich|Two|John|Stamos|Three|John|Travolta') != None
return 'Yes'
しかし、それは私がやりたいことをするものではないと思います。
詳細:
私は実際にTravoltas
andを探しているわけではありませんMalkovichs
(衝撃的です、私は知っています)。、、、などのinotifyパターンと照合しIN_MOVE
、それらをログに記録して何百ものものを取得し、次に入って... ....などの特定のパターンを探しますが、場合によってはそうしません' t が必要です。私は基本的に、inotify を使用して、テキスト エディターが暴走し、ファイルを変更するだけでなく一時ファイル スワップ保存を実行してプログラマーの魂を粉砕しようとしたことを検出するためのパターン マッチングを行っています。これらのログをすぐに解放したくはありませんが、必要な期間だけ保持したいと考えています。ログを消去しないことを意味します。IN_CREATE
IN_OPEN
IN_ACCESS
IN_OPEN
IN_MODIFY
IN_DELETE
IN_OPEN
Maybe
Yes
は、何かを実行してからログを消去することをNo
意味し、何もせずにログを消去することを意味します。プログラムごとに複数のルールがあるため(つまりvim
v gedit
v emacs
)、人間が読みやすく書きやすい正規表現を使用してから大規模なツリーを作成するか、ユーザーJoelが提案したように、ループ