while循环赋值表达式中m.end()是否指向前一次匹配的末尾?
正则表达式循环中
m.end()的作用解答 先看你提供的Python代码:
m = re.match(pattern, text) while m := p.search(text, m.end()): # do with match
答案是肯定的:这里的m.end()确实指代前一次匹配得到的m对象,作用就是让p.search()从上次匹配结果的末尾位置开始搜索,避免重复匹配同一内容。
原理很明确:Python的赋值表达式:=遵循「先计算右侧表达式,再赋值给左侧变量」的执行顺序。在while循环条件中,第一次执行时,m是之前re.match()得到的匹配对象,调用m.end()会返回上次匹配结束的索引位置,p.search()就从这个位置开始查找下一个匹配;找到后,新的匹配对象会赋值给m,下一次循环时,m.end()就会基于这个新的匹配对象的结束位置计算,以此类推,直到p.search()找不到匹配、返回None时,循环终止。
虽然PEP-572没专门提及while循环的场景,但赋值表达式的执行逻辑是确定的,因此这里的m.end()必然是用赋值前的m(也就是前一次的匹配对象)来计算的。
内容的提问来源于stack exchange,提问作者Abhijit Sarkar
相关产品推荐
相关产品推荐

