2012-03-31 17 views
7

मैं स्ट्रिंग में एक विशिष्ट स्थिति पर स्ट्रिंग '02 d0 'नहीं होने पर बाइट्स के अनुक्रम से मिलान करना चाहूंगा। वह स्थिति जहां दो बाइट्स की यह स्ट्रिंग नहीं हो सकती है बाइट स्थिति 6 और 7 दायीं तरफ 0 वें बाइट से शुरू होती है।नकारात्मक देखो आगे python regex

यह है कि मैं क्या परीक्षण के लिए उपयोग किया गया है है:

#!/usr/bin/python 
import re 

p0 = re.compile('^24 [\da-f]{2} 03 (01|03) [\da-f]{2} [\da-f]{2} [\da-f]{2} (([^0])| (0[^2])|(02 [^d])|(02 d[^0])) 01 c2 [\da-f]{2} [\da-f]{2} [\da-f]{2} 23') 
p1 = re.compile('^24 [\da-f]{2} 03 (01|03) [\da-f]{2} [\da-f]{2} [\da-f]{2} (([^0])|(0[^2])|(02 [^d])|(02 d[^0])) 01') 
p2 = re.compile('^24 [\da-f]{2} 03 (01|03) [\da-f]{2} [\da-f]{2} [\da-f]{2} (([^0])|(0[^2])|(02 [^d])|(02 d[^0]))') 
p3 = re.compile('^24 [\da-f]{2} 03 (01|03) [\da-f]{2} [\da-f]{2} [\da-f]{2} (?!02 d0) 01') 
p4 = re.compile('^24 [\da-f]{2} 03 (01|03) [\da-f]{2} [\da-f]{2} [\da-f]{2} (?!02 d0)') 

yes = '24 0f 03 01 42 ff 00 04 a2 01 c2 00 c5 e5 23' 
no = '24 0f 03 01 42 ff 00 02 d0 01 c2 00 c5 e5 23' 

print p0.match(yes) # fail 
print p0.match(no) # fail 
print '\n' 
print p1.match(yes) # fail 
print p1.match(no) # fail 
print '\n' 
print p2.match(yes) # PASS 
print p2.match(no) # fail 
print '\n' 
print p3.match(yes) # fail 
print p3.match(no) # fail 
print '\n' 
print p4.match(yes) # PASS 
print p4.match(no) # fail 

मैं this example को देखा, लेकिन वह विधि कम प्रतिबंधक की तुलना में मैं की जरूरत है। क्या कोई यह समझा सकता है कि क्यों स्ट्रिंग के अंत में नकारात्मक दिखने पर मैं ठीक से मिलान कर सकता हूं? इस विशिष्ट बिट स्थिति में '02 डी 0 'नहीं होने पर मिलान करने के लिए मुझे क्या करने की ज़रूरत है?

+1

मैं केवल एक है जो सोचता है 'हूँ [0-9a-च]' 'से [\ da-च]' अधिक पठनीय है? – ThiefMaster

+0

आपका मतलब है "पद 7 और 8", है ना? – Qtax

उत्तर

11

लुकहेड "शून्य-चौड़ाई" हैं, जिसका अर्थ है कि वे किसी भी वर्ण का उपभोग नहीं करते हैं। उदाहरण के लिए, इन दोनों भाव से मेल खाते हैं कभी नहीं होगा:

  1. (?=foo)bar
  2. (?!foo)foo

सुनिश्चित करें कि एक नंबर कुछ विशिष्ट संख्या है, आप का उपयोग नहीं कर रहा है हो सकता है:

(?!42)\d\d # will match two digits that are not 42 

में आपका मामला यह दिख सकता है:

(?!02)[\da-f]{2} (?!0d)[\da-f]{2} 

या:

(?!02 d0)[\da-f]{2} [\da-f]{2} 
+0

यह एक बहुत अच्छी व्याख्या थी। आपका बहुत बहुत धन्यवाद! – Michael

+0

[\ da-f] क्यों उपयोग किया जाता है? – umayneverknow

+0

@umayneverknow '[\ da-f]' हेक्स अंकों से मेल खाता है। समान रूप से, '[0-9 ए-एफ] 'का उपयोग किया जा सकता है। – frederick99