Skip to content

Instantly share code, notes, and snippets.

@ross-spencer
Created April 17, 2018 11:58
Show Gist options
  • Select an option

  • Save ross-spencer/2eefc4023a34e1a91fb46badec920cfc to your computer and use it in GitHub Desktop.

Select an option

Save ross-spencer/2eefc4023a34e1a91fb46badec920cfc to your computer and use it in GitHub Desktop.
Python Regex Bug?
None
<_sre.SRE_Match object; span=(0, 519), match='\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\>
None
import re
re1 = "(?s)\A\x00.{3}\x00\x00\x00(?!\x00).{504}\x00\x00\x00[\x00-\x02].{4}(?!\x00)"
re2 = "(?s)\A\x00.{3}\x00\x00\x00(?!\x00).{504}\x00\x00\x00[\x00-\x02].{4}"
re3 = "(?s)\A\x00.{3}\x00\x00\x00(?!\x00).{504}\x00\x00\x00[\x00-\x02].{4}\x01"
file = ("\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x01\x00\x00\x00\x00\x01")
print (re.match(re1, file))
print (re.match(re2, file))
print (re.match(re3, file))
@marhop
Copy link

marhop commented Apr 17, 2018

Granted, this is a damned subtle one :-)

Try one of these:

re4 = "(?s)\A\x00.{3}\x00{3}[^\x00].{504}\x00{3}[\x00-\x02].{4}\x01"
re5 = "(?s)\A\x00.{3}\x00{3}[^\x00].{504}\x00{3}[\x00-\x02].{4}[^\x00]"

The problem is you are using lookahead, which is a zero-width assertion. That means (?!\x00) makes the regex engine check if there is one character that's not 0x00 coming after the current position in the string, but it does not "consume" this caracter: it does not move forward. Using a negated character class instead actually consumes the matched character.

Cheers,
Martin

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment