12

私はこのパターンを書いています

^.*\.(?!jpg$|png$).+$

ただし、問題があります。このパターンは file.name.jpg (2 つのドット) に一致します。

filename.jpg では正しく動作します (一致しません)。ファイルの名前に2つ以上のドットが含まれていても、.jpgファイルと一致しないようにする方法を見つけようとしています。ルックビハインドを使用してみましたが、python は固定幅を使用していないと文句を言います (これが何を意味するのか正確にはわかりませんが、ファイル名は可変長になります)。

4

5 に答える 5

17

これは機能するはずです:^.*\.(?!jpg$|png$)[^.]+$

于 2012-04-07T05:53:26.050 に答える
3

.jpg文字列がまたはで終わらないことだけを気にする場合は.png、これを使用できます。

^.+$(?<!\.jpg)(?<!\.png)

^.+厳密には必要ではありませんが、JSON パーサーのコーディング方法によっては、正規表現に文字列全体を強制的に使用させる必要がある場合があります。他の検証にも正規表現を使用している場合は、次のようなより複雑なものが必要になる場合があります。

^\w+(?:\.\w+)+$(?<!\.jpg)(?<!\.png)

(?<!\.jpg|\.png)Python の正規表現フレーバーは、後読みに関しては最も制限が厳しいものの 1 つであるため、おそらく を使用しようとしましたが、これは機能しません。PHP と Ruby 1.9+ は、それぞれの選択肢が固定長であるため、それを受け入れます。同じ長さである必要はありません。(?<!\.jpg|\.jpeg|\.png)もうまくいくでしょう。のようにドットを因数分解しようとしないでください(?<!\.(?:jpg|jpeg|png))。代替は、後読みの最上位にある必要があります。

Java は、後読みが一致する必要がある可能性のある最大文字数を決定するために、コンパイル時にもう少し作業を行うため、除外されたバージョンを受け入れます。ただし、後読み式はかなり単純である必要があり、+または*量指定子を使用できません。最後に、.NET および JGSoft フレーバーは後読みにまったく制限を設けません。しかし、Python は、後読みが一致する必要がある正確な文字数を把握するために非常に単純な試みを行い、失敗したときに不可解なエラー メッセージを生成します。

于 2012-04-07T15:23:30.583 に答える
3

の気の利いた関数を使用os.pathして、ファイルパスをコンポーネントに適切に分割し、解析を容易にします。

filepath, filename = os.path.split(str)
basename, extension = os.path.splitext(filename)

if exension[1:] in ['jpg', 'png']:
  # The extension matches

この正規表現を試してください (やらないでください。やりたいこととは正反対のことをします):

\.(jpg|png)([^\.]|$)
于 2012-04-07T05:29:20.570 に答える
1

あなたはほとんどそれを持っていたように見えます:

.*\.(?!jpg$|png$)[^.]+

私のテスト(Javaで)によると、次の結果が得られます。

file.jpg - false
file.png - false
file.name.jpg - false
file.name.png - false
file.gif - true
file.name.gif - true
file.jpg.gif - true
file.jpge - true

これがあなたが望んでいたものではない場合は、あなたの期待に沿って質問を更新してください。

于 2012-04-07T07:45:42.500 に答える
0

してみてください

    .*\.(jpg$|png$)

filename.jpg で正しく一致します。ファイル名に 2 つ以上のドットが含まれている場合でも、任意の .jpg ファイルに一致させる方法を見つけようとしてもうまくいきます。
Python スクリプトを使用している間は、正しい種類の分割を使用していることを確認してください。異なるタイプの分割、つまり rsplit (右分割) と lsplit (左分割)。

于 2012-04-07T07:14:08.103 に答える