首页 > 编程问答 >为什么在 Python 上使用正则表达式组功能会给出不同的输出

为什么在 Python 上使用正则表达式组功能会给出不同的输出

时间:2024-07-26 04:04:54浏览次数:8  
标签:python python-3.x regex

import re
string1 = "aaabaa"
zusuchen = "aa"

#1
m_start = re.finditer(fr'(?=({zusuchen}))', string1)
results = [(match.start(1), match.end(1)-1) for match in m_start]
for z in results:
    print(z)

print("Now #2:")
#2
m_start = re.finditer(fr'(?={zusuchen})', string1)
results = [(match.start(), match.end()-1) for match in m_start]
for z in results:
    print(z)

我仍然没有弄清楚#2 的问题是什么。 我认为输出应该是相同的

但是我得到的输出: (0, 1) (1, 2) (4, 5) 现在#2: (0, -1) (1, 0) (4, 3)


这两个代码段的输出之所以不同,是因为正则表达式中的捕获组以及 finditer 函数的工作方式不同。

让我们来分析一下两段代码:

代码段 1:

m_start = re.finditer(fr'(?=({zusuchen}))', string1)
results = [(match.start(1), match.end(1)-1) for match in m_start]
  • 正则表达式 fr'(?=({zusuchen}))' 使用了两个组:
    • 外层组 (?=...) 是一个非捕获组,它使用先行断言 (?=...) 来查找 zusuchen (即 "aa")出现的位置,但不包含匹配的字符本身。
    • 内层组 ({zusuchen}) 是一个捕获组,它捕获了实际匹配 zusuchen 的字符。
  • match.start(1) match.end(1) 获取的是 内层捕获组 的起始和结束位置。

因此,代码段 1 输出的是 "aa" 在字符串中出现的位置,即 (0, 1), (1, 2), (4, 5)。

代码段 2:

m_start = re.finditer(fr'(?={zusuchen})', string1)
results = [(match.start(), match.end()-1) for match in m_start]
  • 正则表达式 fr'(?={zusuchen})' 只使用了一个非捕获组 (?=...) ,它同样使用先行断言查找 zusuchen 出现的位置,但没有捕获任何字符。
  • match.start() match.end() 获取的是 整个匹配 的起始和结束位置。由于没有捕获组,所以返回的是先行断言匹配成功的位置。

由于先行断言匹配的是一个 零宽度的位置 (即 "aa" 出现之前的位置),所以 match.end() 返回的是与 match.start() 相同的值。因此,代码段 2 输出的是 "aa" 出现之前的 位置索引 ,即 (0, -1), (1, 0), (4, 3)。

总结:

  • 代码段 1 使用了捕获组,所以返回的是匹配的字符 "aa" 的位置。
  • 代码段 2 只使用了非捕获组,所以返回的是 "aa" 出现之前的 位置索引

希望这个解释能够帮助你理解两个代码段输出不同的原因。

标签:python,python-3.x,regex
From: 78795195

相关文章

  • 如何在python3中找到文件的长度?
    我的第一个.py:defcreate_file(file_name):list=["ab","cd","ef"]foriinlist:withopen(file_name,"a+")asinput_file:print("{}".format(i),file=input_file)我的第二个.py:fromfirstimport......
  • 哪种 python 日志记录风格是推荐的或标准的?
    我是Python新手。介于以下2个选项之间。对于python来说,推荐哪种风格或者更好?logging.info(f"Won'tsavemodelasscoreisbelow0,score:{score}")logging.info("Won'tsavemodelasscoreisbelow0,score%s",score)我个人更喜欢第二种方法。在Python......
  • python 协程 自定义互斥锁
    最近在用python的一款异步web框架sanic搭建web服务,遇到一个需要加特定锁的场景:同一用户并发处理订单时需要排队处理,但不同用户不需要排队。如果仅仅使用asyncwithasyncio.Lock()的话。会使所有请求都排队处理。1importasyncio2importdatetime34lock=asyncio.L......
  • Python 获取tiktok视频评论回复数据 api接口
    TIKTOKapi接口爬取tiktok视频评论回复数据详细采集页面如图https://www.tiktok.com/@dailymail/video/7329872821990182190?q=neural%20link&t=1706783508149请求APIhttp://api.xxxx.com/tt/video/info/comment/reply?video_id=7288909913185701125&comment_id=7294900......
  • Shopee虾皮api python获取虾皮购物平台的商品数据信息 数据采集
    虾皮购物(英语:Shopee)是一个电商平台,总公司设在新加坡,归属于SeaGroup(之前称之为Garena),该企业于2009年由李小冬(ForrestLi)创办。虾皮购物于2015年初次在新加坡推出,现阶段已拓展到马来西亚、泰国、印度尼西亚、越南和菲律宾。虾皮购物为全球华人地区的客户提供线上购物和销售......
  • python实现图像特征提取算法1
    python实现Marr-Hildreth算法、Canny边缘检测器算法1.Marr-Hildreth算法详解算法步骤公式Python实现详细解释优缺点2.Canny边缘检测器算法详解算法步骤公式Python实现详细解释优缺点1.Marr-Hildreth算法详解Marr-Hildreth算法是一个......
  • python实现盲反卷积算法
    python实现盲反卷积算法盲反卷积算法算法原理算法实现Python实现详细解释优缺点应用领域盲反卷积算法盲反卷积算法是一种图像复原技术,用于在没有先验知识或仅有有限信息的情况下,估计模糊图像的原始清晰图像和点扩散函数(PSF)。盲反卷积在摄影、医学成......
  • Python——异常捕获,传递及其抛出操作
    01.异常的概念1.程序在运行时,如果python解释器遇到一个错误,会停止程序的执行,并且提示一些错误信息,这就是异常。2.程序停止执行并且提示错误信息这个动作,我们通常称之为:抛出(raise)异常。 程序开发时,很难将所有的特殊情况都处理的面面俱到,通过异常捕获可以针对突发事件做......
  • Python 多进程下日志打印
    Python多进程下日志打印问题分析使用gunicorn启动Flask时,如果直接使用logging的RotatingFileHandler模块会出现日志混乱,甚至日志丢失的情况。在日志翻转时,可能出现一个进程将log文件翻转,而后又有进程也将log文件翻转,导致log.1文件并未达到设置的最大的文件大小,......
  • python 装饰器执行顺序的代码示例
    defdecoratorA(func):print(33)defwrapperA():print("EnteringA")print(func())print("ExitingA")print(44)returnwrapperAdefdecoratorB(func):print(11)defwrapperB():print("Ent......