Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式re.finditer与match.end()的奇怪行为_Python_Regex - Fatal编程技术网

Python正则表达式re.finditer与match.end()的奇怪行为

Python正则表达式re.finditer与match.end()的奇怪行为,python,regex,Python,Regex,我试图在文件中找到模式的位置,我正在使用Python正则表达式。当我运行下面的代码时,会打印几个开始位置,但只打印一个结束位置,即对应于最新开始位置的位置。底部打印语句也只打印一次。为什么每个match.start()值都没有match.end()值?文件是一个.obj文件 import re import binascii def findByte(b,file): f = open(file, "rb").read() f = binascii.hexlify(f)

我试图在文件中找到模式的位置,我正在使用Python正则表达式。当我运行下面的代码时,会打印几个开始位置,但只打印一个结束位置,即对应于最新开始位置的位置。底部打印语句也只打印一次。为什么每个
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))
进行纯粹基于选项卡的缩进,然后四个空格后跟一个选项卡作为后续行的缩进

大多数这种混合缩进的东西被Python3拒绝了,但是Python2更灵活(它给了你自缢的绳索),这可能就是这里正在发生的事情(Python2从今年年初就已经结束了,所以如果你正在编写新代码,我建议出于这个和许多其他原因进行切换)。您的代码看起来都在
for
循环中,但大部分不是


将所有选项卡替换为四个空格缩进,并重新配置编辑器,以便将来始终将选项卡扩展为空格,这样以后您就不会被这一点所困扰;Python风格的出现是有原因的。

请提供一个示例
regex
f
,这样人们就可以真实地再现这种行为。如果我简单地定义
regex=r'\d\d'
f='12 34 45 abc 34 def 1'
,它的工作原理与您描述的完全一样,因此请提供输入,但是你得到的输出以及你期望它们如何不同这显然是你的正则表达式的问题-在这里尝试一下,与我使用re.findall和同一个正则表达式来查找匹配项时相比,它是有效的。(不幸的是,我不能这样做,因为我需要这些职位。)为什么会这样?你的结果是不可能的;如果写入的
E
不匹配,它就无法打印
S
输出(即使
match.end()
以某种方式返回空字符串或其他内容,它仍会打印
E
,而您根本看不到)。我99%确定以
e=match.end()
开头的行在实际代码中的
for
循环之外,因此它们只在
for
循环退出后的最后一个
match
对象上运行一次。如果您想知道为什么一段代码“有效”而另一段代码“无效”,最好共享这两段代码,这样人们就可以看到你在说什么,以及当你认为它们“起作用”时是什么样子