2009-11-23 40 views
8

Normalde, mpeg ile başlamayan dizelerle eşleşen normal ifadeleri bulmaya çalışıyorum. Bunun bir genelleştirmesi, belirli bir düzenli ifadeyle başlamayan herhangi bir dizgenin eşleştirilmesidir.Belirli bir düzenli ifade dışında her şeyle eşleşen düzenli ifade

[^m][^p][^e][^g].* 

bu sorun, dize bulunması en az 4 karakter gerektirir:

ben şöyle şöyle bir şey denedik. Bunu ele almanın iyi bir yolunu ve bunu genel bir şekilde ele almak için genel bir yol bulmayı başaramadım.

Bunu Python'da kullanıyorum. Eğer Terslenmis sınıfları kullanmak istiyorsanız Veya sadece

(?!mpeg)^.* 

:

^(.{0,3}$|[^m]|m([^p]|p([^e]|e([^g])))).*$ 
+2

Eğer istemediğiniz her şeyi ile eşleşir ve istediğiniz her şeyi eşleşmeyen bir düzenli ifade varsa , neden sadece kullanmıyorsun? –

+3

Bu topluluk neden wikidir? –

+0

Oh Bence topluluk wiki'nin amacını anlıyorum. Bu yüzden onay kutusunu yanlışlıkla seçtim. –

cevap

22
^(?!mpeg).* 

Bu sadece başlangıç ​​kokan bir dize eşleştirmek için bir negatif ileri yönlü kullanır

+0

+1. –

+0

Regex, bir kullanıcı tarafından bir web arayüzü üzerinden giriliyor. Bu yüzden ben python programında kendimi regex yazmadım. Regex, yazılımımın dosyaları seçtiği bir izleme klasörü için bir filtre ayarının türüdür. Kullanıcı, regex'i doldurmak için kullanıcı arayüzünü kullanır. Python kodum bu regex'i filtreleme kriteri olarak alır ve uygun klasörleri izleme klasöründen alır. Yanıtla ilgili çok fazla bilgi. –

+0

Veya "Eğer inputstring.startswith ('mpeg')' değilse bile – Paul

2

bir look-ahead assertion deneyin t mpeg ile eşleşmelidir. Esasen, "dizenin başlangıcındaki konum, regex mpeg'u eşleştirmeye başlasaydık, başarılı bir şekilde eşleşebildiğimiz bir konum olamaz" - böylece mpeg ile başlamamış herşeyi eşleştirip, hiçbir şeyle eşleşmemesini gerektirir. .

Ancak, ben bunu kullanarak hangi bağlamda merak olurdu - ... gibi ya daha verimli veya daha okunabilir olacaktır kenara diğer seçenekler regex gelen olabileceğini

if not inputstring.startswith("mpeg"): 
+0

"reddedilen sınıfınız" regex'i çalışmaz. sözdizimini kontrol et. –

+0

@ J-16 SDiZ: Neden böyle düşünüyorsunuz? – Gumbo

+0

Muhtemelen, dizenin başlangıcından önce mpeg'yi "eşleştirmeye" çalıştığınızı düşündüğü için. Her ne kadar mükemmel bir yasallık olsa da ^, sıfır genişlikte bir çapadır - kafa karıştırıcı gibi gözükse de haklıdır. –

8

Zihninizi regex ile kaybetmeyin. "Değil" anahtar kelime

if len(mystring)>=4 and not mystring.startswith("mpeg") 
+5

Aslında 'len()' kontrolüne ihtiyacınız olmadığını unutmayın - dizeleri sınırlarının ötesine dilimleyebilirsiniz, sadece daha az karakter geri alırsınız. – Amber

+0

evet, bunu biliyorum. Sadece OP'nin gereksinimini yanlış anlayabilirim. "Dizede bulunması en az 4 karakter gerektirir" dedi. Anahtar kelime "dizgede" dir. Uzun bir ip olabilir ve bu gereksinime de sahip olabilir. Her neyse, şimdi doğru yapmak için OP'ye kadar. – ghostdog74

+0

Sanırım biraz daha önce 4 karakterden daha az olsa bile, "mpeg" ile başlamamış bir şeyle eşleşmek istediğinde, regex'teki orijinal girişiminin dizede 4 karakter olmasını gerektirdiğini sanıyordum. – Amber

0

Kişisel regexp'in "npeg" maç olmaz ile

if len(mystring) >=4 and mystring[:4]=="mpeg": 
    print "do something" 

veya kullanım startswith(), epey korkunç ^($|[^m]|m($|[^p]|p($|[^e]|e($|[^g])))), ile gelip gerekir düşünüyorum. Başka bir alternatif ise sadece biraz daha iyi olan ^(.{0,3}$|[^m]|.[^p]|..[^e]|...[^g]) olacaktır. Dav ve Bamya :-) tarafından önerildiği gibi

Yani gerçekten bir ileriye bakma iddiayı kullanmak gerektiğini düşünüyorum

+0

Alternatifiniz, doğru olmadığı için alternatif değil. Bu, * npeg * ile eşleşmez. – Gumbo

+0

Denedin mi? re.match (r "^ (. {0,3} $ | [^ m] |. [^ p] | .. [^ e] | ... [^ g])", "npeg") bir döndürür Eşleme nesnesi. Çalışır çünkü [^ m] geçer. –