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日