2012-04-07 10 views
5

Bu model Belirli uzantılarla eşleşmeyen normal desen mi? Bu desen Bu doğru çalıştığından dosyaadı.JPG üzerinde (eşleşmeyen) file.name.jpg (2 nokta)</p> <p>maçları -

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

Ancak bir sorun vardır

yazılı var. Dosyanın adı 2 veya daha fazla noktaya sahip olsa bile, ANY .jpg dosyalarıyla eşleşmemesini nasıl anlamaya çalışıyorum. Geriye bir bakış kullanmayı denedim ama python sabit bir genişlik kullanmamadan şikayet ediyor (ki bunun tam olarak ne anlama geldiğinden emin değilim, fakat dosya adı değişken uzunlukta olacak.)

cevap

10

Bu çalışması gerekir: ^.*\.(?!jpg$|png$)[^.]+$

+0

harika iş! Mükemmel – yash

3

os.path 'un düzgün işlevlerini düzgün bir şekilde bölmek için kullanın kolay ayrıştırma için bileşenlerine filepath up:

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

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

bu regex (yapmayın size ne yapmak istediğinizi tam tersini yapar.) deneyin:

\.(jpg|png)([^\.]|$) 
+0

Python'a erişimim yok, bu Python'un normal sekmeli motorudur, ancak bir Python programı için normal ifadeyi kullanmak üzere yalnızca JSON yapılandırma dosyasına erişebiliyorum. Karışıklığı önlemek için Python etiketini kaldırdım. –

+0

Düzenleme bölümüne bakın. Çalışması gerektiğini düşünüyorum – Blender

+0

Regex'in * * .jpg.' veya '.png.' içerdiği dizeleri hariç tutmaya çalıştığı anlaşılıyor, ancak fikrin * .jpg ile biten herşeyi hariç tutması gerektiğine inanıyorum. '.png'. OP'nin regex'i başarısız olur, çünkü hem lookahead hem de final '. + $', '' File.name.jpg''de ilk '.' sonra eşleşebilir. Bunu, @bereal'in yaptığı gibi, [^.] + $ 'Olarak değiştirmek, sadece son noktaya ne olursa olsun uygulamak için zorlar. –

0

Bu doğru dosyaadı.JPG üzerinde maç olacak

 
    .*\.(jpg$|png$) 

deneyin. Dosyanın adı 2 veya daha fazla noktaya sahip olsa bile ANY .jpg dosyalarını nasıl eşleştireceğinizi anlamaya çalışıyorsunuz.
Python komut dosyasını kullanırken doğru türden bölme kullandığınızdan emin olun. farklı tipteki split viz rsplit (sağ ayrık) ve lsplit (sol bölme). Bu size yakarışlarıyla soruyla güncellemek istediğini değilse

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) benim testlere göre

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

Ben bu sonuçları elde:

+0

Geriye doğru var: regex 'filename.jpg' VEYA' file.name.png' ile eşleşmemelidir. 'filename.txt' veya' file.name.foo' tamam, varsayalım. –

1

Neredeysebitirmeyi vardı benziyor Beklentileriniz.

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

^.+ kesinlikle gerekli değildir, ancak JSON ayrıştırıcı sizi kodlu şekline bağlı:

1

yalnızca dize .jpg veya .png ile bitmez veriyorsan, bunu kullanabilirsiniz tüm dizeyi tüketmek için regex zorlamak gerekebilir. Muhtemelen Python'un regex lezzet en biridir çünkü işe yaramaz, hangi (?<!\.jpg|\.png) kullanmaya çalıştı

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

: siz de diğer doğrulamaları için regex kullanarak ediyorsanız, daha ayrıntılı kullanılabilen bir şey, isteyebilirsiniz Lookbehinds gelince kısıtlayıcı. PHP ve Ruby 1.9+ bunu kabul eder, çünkü her bir alternatifin sabit bir uzunluğu vardır. Onlar bile aynı uzunluğu olmak zorunda değiller; (?<!\.jpg|\.jpeg|\.png) da işe yarayacaktı. Sadece (?<!\.(?:jpg|jpeg|png))'da olduğu gibi noktayı dışa vurmaya çalışmayın; alternatif, lookbehind'in üst seviyesinde olmalıdır.

Java, factorb-out sürümünün eşleşmesi gerekebilecek maksimum karakter sayısını belirlemek için derleme zamanında biraz daha fazla çalışma yaptığından, faksı alınmış sürümü kabul eder. Bununla birlikte, lookbehind ifadesinin oldukça basit olması gerekir ve + veya * niceleyicileri kullanamaz. Son olarak, .NET ve JGSoft lezzetleri hiç bir kısıtlama getirmiyor. Ancak Python, göz ardı etmek istediğinde bu şifreli hata mesajını oluşturarak, bakma kodunun eşleşmesi gereken karakter sayısını tam olarak belirlemek için çok basit bir girişimde bulunur.

+0

Teşekkürler, harika cevap. –