Отрицательный взгляд вперед Python regex
Я хотел бы, чтобы регулярное выражение соответствовало последовательности байтов, когда строка '02 d0' не возникает в определенной позиции в строке. Позиция, в которой эта строка из двух байтов не может возникнуть, - это позиции 6 и 7 байтов, начинающиеся с 0-го байта справа.
Это то, что я использовал для тестирования:
#!/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" не происходит в этой конкретной битовой позиции?
1 ответов
Lookaheads-это "нулевая ширина", то есть они не потребляют никаких символов. Например, эти два выражения никогда не совпадают:
(?=foo)bar
(?!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}