EL_Psy_Congroo_0 2022-02-01 16:52 采纳率: 33.3%
浏览 31
已结题

关于python正则贪婪与否的问题

如题,下面是两段代码:

if __name__ == '__main__':
    str = 'video_1751028'
    ex = 'video_(.*)'
    contId = re.findall(ex, str)
    print(contId)

```python
if __name__ == '__main__':
    str = 'video_1751028'
    ex = 'video_(.*?)'
    contId = re.findall(ex, str)
    print(contId)



我想得到video后面的id,但是只有第一个(应该是贪婪)才能得到id,第二种会输出一个[' '],请问原理
  • 写回答

4条回答 默认 最新

  • 关注
    你要注意.*是匹配0个或多个任意字符,就是最少可以匹配0个字符
    你第二个代码.*后面有?是非贪婪模式,是尽可能的少匹配字符,
    你.*?之后没有其它的匹配条件,于是就只匹配了0个字符,返回一个空的字符串""
    而第一个代码.*后面没有?贪婪模式,是尽可能的多匹配字符,这样才能把video_之后的字符都匹配了
    你在.*?之后加上一个匹配条件,才能看出非贪婪模式的作用,
    如(.*?)之后加上(?:,|$)匹配一个逗号或字符串结尾
    
        import re
        if __name__ == '__main__':
            str = 'video_1751028,9999,11111'
            ex = 'video_(.*?)(?:,|$)'
            contId = re.findall(ex, str)
            print(contId)
    
    非贪婪模式的(.*?)只会匹配到第一个逗号前面的字符
    如果是贪婪模式的'video_(.*?)(?:,|$)'会一直匹配到$字符串结尾
    

    如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月12日
  • 已采纳回答 2月4日
  • 创建了问题 2月1日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?