如题,下面是两段代码:
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,第二种会输出一个[' '],请问原理
你要注意.*是匹配0个或多个任意字符,就是最少可以匹配0个字符
你第二个代码.*后面有?是非贪婪模式,是尽可能的少匹配字符,
你.*?之后没有其它的匹配条件,于是就只匹配了0个字符,返回一个空的字符串""
而第一个代码.*后面没有?贪婪模式,是尽可能的多匹配字符,这样才能把video_之后的字符都匹配了
你在.*?之后加上一个匹配条件,才能看出非贪婪模式的作用,
如(.*?)之后加上(?:,|$)匹配一个逗号或字符串结尾
import re
if __name__ == '__main__':
str = 'video_1751028,9999,11111'
ex = 'video_(.*?)(?:,|$)'
contId = re.findall(ex, str)
print(contId)
非贪婪模式的(.*?)只会匹配到第一个逗号前面的字符
如果是贪婪模式的'video_(.*?)(?:,|$)'会一直匹配到$字符串结尾
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
非贪婪匹配由于是*?,所以没内容也会匹配,直接得到空内容分组,可以加个$结束符,匹配全部直到最后没有内容
ex = 'video_(.*?)$'
不过这个正则和第一个题主的可能会匹配出一些不需要的内容,比如链接地址还有其他参数,会导致匹配出来不需要内容,如
比如video_1751028&abc=11,会得到1751028&abc=11这些内容,多了不需要的,最好是根据实际需要的内容写正则,如视频id后面为数字,直接用这个正则
import re
if __name__ == '__main__':
str = 'video_1751028&abc=11'
ex = 'video_(\d+)'
contId = re.findall(ex, str)
print(contId)
防止匹配出不需要的内容
你不是说了原理了吗,第一个是贪婪的,第二个不是,这是正则的一个语法
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!