负向前看python正则表达式

Mic*_*ael 12 python regex negative-lookahead

当字符串'02 d0'没有出现在字符串中的特定位置时,我想正则表达式匹配一个字节序列.不能出现这个两个字节的字符串的位置是从右侧第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
Run Code Online (Sandbox Code Playgroud)

我看了一下这个例子,但是这种方法的限制性比我需要的要少.有人可以解释为什么我只能在负面向前看到字符串末尾时才能正确匹配吗?如果在此特定位位置没有出现"02 d0",我需要做什么才能匹配?

Qta*_*tax 19

前瞻是"零宽度",意味着它们不消耗任何字符.例如,这两个表达式永远不会匹配:

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

要确保某个数字不是某个特定数字,您可以使用:

(?!42)\d\d # will match two digits that are not 42
Run Code Online (Sandbox Code Playgroud)

在你的情况下它可能看起来像:

(?!02)[\da-f]{2} (?!0d)[\da-f]{2}
Run Code Online (Sandbox Code Playgroud)

要么:

(?!02 d0)[\da-f]{2} [\da-f]{2}
Run Code Online (Sandbox Code Playgroud)

  • @umayneverknow `[\da-f]` 匹配一个十六进制数字。等效地,可以使用`[0-9a-f]`。 (2认同)