2012-04-07 8 views
5

私はこのパターンが 正規表現と一致しない正規表現パターン?このパターンは、それが正しく動作filename.jpgに(一致しない)file.name.jpg(2つのドット)</p> <p>と一致する -

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

しかし問題がある

を書かれています。私はどのようにファイルの名前に2つ以上のドットがある場合でも、それが.jpgファイルに一致しないようにする方法を見つけようとしています。私は背後を見てみましたが、Pythonは固定幅を使用しないことについて文句を言います(これは意味が分かりませんが、ファイル名は可変長になります)。

答えて

10

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

+0

素晴らしい作品!優れた – yash

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)([^\.]|$) 
+0

私はPythonの正規表現エンジンですが、Pythonプログラム用の正規表現をそこに置くためのJSON設定ファイルにしかアクセスできません。混乱を避けるためにPythonタグを削除しました。 –

+0

私の編集を参照してください。私はそれが動作するはずだと思う – Blender

+0

あなたの正規表現は* '.jpg.'または' .png.'を含む文字列を除外しようとしているように見えますが、* .jpgまたは* '.png'。ルックアヘッドと最終的な '。+ $'の両方が 'file.name.jpg'の最初の' .'の後にマッチするので、OPの正規表現は失敗しています。 @berealのように '[^。] + $'に変更すると、先読みはどのような順序であっても最後のドットにのみ適用されます。 –

0

それは正しくfilename.jpgに一致します

 
    .*\.(jpg$|png$) 

てみてください。ファイル名に2つ以上のドットがあっても、どのような.jpgファイルにもマッチさせる方法を見つけようとすると、正常に動作します。
Pythonスクリプトを使用しているときに、正しいタイプの分割を使用していることを確認してください。 rsplit(右スプリット)とlsplit(左スプリット)の異なるタイプのスプリット。これはあなたが嘆願を持つあなたの質問を更新したかったものではない場合

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 

:(Javaで)私のテストによると

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

私はこれらの結果を得る:

+0

あなたはそれを後ろに持っています:正規表現は 'filename.jpg'または' file.name.png'と一致しません。 'filename.txt'や' file.name.foo'は大丈夫です。 –

1

は、あなたがほとんどそれを持っていたように見えますあなたの期待。

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

^.+は厳密には必要ではないが、JSONパーサーがあなたのコード化された方法に応じて:

1

あなただけの文字列が.jpgまたは.pngで終わっていないことを気にしている場合は、これを使用することができます正規表現に文字列全体を強制的に使用させる必要があるかもしれません。 Pythonの正規表現の風味が最もの一つであるため、

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

あなたはおそらく動作しないでしょう(?<!\.jpg|\.png)を、使用しようとした:あなたは、他の検証のための正規表現を使用している場合は、同じように、何かがより精巧な場合がありますlookbehindsに関しては制限的です。 PHPとRuby 1.9以降は、それぞれの選択肢が固定長であるため、それを受け入れます。彼らはと同じである必要はありません同じの長さ; (?<!\.jpg|\.jpeg|\.png)も機能します。 (?<!\.(?:jpg|jpeg|png))のように、ドットを除外しようとしないでください。交互は見た目の最上位レベルになければならない。

コンパイル時にもう少し作業をして、見た目のヒントが一致する必要がある可能性のある最大文字数を判断するため、Javaは因数分解バージョンを受け入れます。 lookbind式はかなり単純でなければならず、+または*の数量子を使うことはできません。最後に、.NETとJGSoftのフレーバーは、lookbehindには何の制限もありません。しかし、Pythonは、lookbehindが一致する必要がある文字の正確な数を把握し、失敗したときにその謎めいたエラーメッセージを生成する、非常に単純な試みを行います。

+0

ありがとう、素晴らしい答え。 –

関連する問題