我正在尝试查找文件中模式的位置,并且我正在使用Python regex。当我运行下面的代码时,会打印几个起始位置,但只打印一个结束位置,即与最新起始位置相对应的结束位置。底部打印语句也只打印一次。为什么不是每个match.start()
值都有一个match.end()
值?文件是.obj文件。
import re
import binascii
def findByte(b,file):
f = open(file, "rb").read()
f = binascii.hexlify(f)
regex = b + "(?=(?:[\da-fA-F]{2})*$)"
for match in (re.finditer(regex, f)):
s = match.start()
print("S" + str(s))
e = match.end()
print("E" + str(e))
g = match.group()
print(g)
print ('String match "%s" at %d:%d' % (g, s, e))
findByte("ca","demo.obj")
当我运行它时,会打印出以下答案。
S0
S64
S184
S252
E254
ca
String match "ca" at 252:254
如果我改为写
def findByte(b,file):
f = open(file, "rb").read()
f = binascii.hexlify(f)
regex = b + "(?=(?:[\da-fA-F]{2})*$)"
m = re.findall(regex,f)
print(m)
findByte("ca","demo.obj")
打印值为
['ca', 'ca', 'ca', 'ca']
检查您粘贴的实际代码,很明显您已经犯下了混合制表符和空格的Python大罪,这让您很痛苦(尝试在这个页面上选择您自己的代码中的前导空格;您会看到其中一些被选为一次四个空格的块,而其他部分则只有一个空格粒度(。编辑器显示制表符相当于四个空格,但在粘贴的代码中,完全基于制表符的缩进一直到print("S" + str(s))
,然后是四个空格和一个制表符作为后续行的缩进。
大多数这种混合缩进的东西都被Python 3拒绝了,但Python 2更灵活(它给了你上吊的绳子(,这可能就是这里正在发生的事情(Python 2从今年年初开始就已经过时了,所以如果你正在编写新代码,我建议出于这个和许多其他原因切换(。您的代码看起来好像都在for
循环中,但大部分都不是。
将所有选项卡替换为四个空格缩进,并将编辑器重新配置为始终将来将选项卡扩展到空格,这样您将来就不会受到此影响;Python风格是一致的四个空格缩进,没有制表符是有原因的。