19

文字列 '02 d0' が文字列内の特定の位置にない場合に、一連のバイトを正規表現で一致させたいと考えています。この 2 バイトの文字列が出現しない位置は、右側の 0 バイト目から始まるバイト位置 6 と 7 です。

これは私がテストに使用しているものです:

#!/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

この例を見ましたが、その方法は必要以上に制限的ではありません。負の先読みが文字列の最後にある場合にのみ適切に一致できる理由を誰かが説明できますか? この特定のビット位置で「02 d0」が発生しない場合、一致させるにはどうすればよいですか?

4

1 に答える 1

41

先読みは「ゼロ幅」です。つまり、文字を消費しません。たとえば、次の 2 つの式は決して一致しません。

  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}
于 2012-03-31T01:32:45.020 に答える