正则表达式是处理字符串的强大工具,它有自己的特定语法结构,其中常用的贪婪匹配与非贪婪匹配是一个难点,下面以代码为例进行解释说明
请看下面这个例子
我们想获取字符串中间的数字,中间写的(\d+),数字两边用.*替代,看看运行结果。
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$',content)
print(result)
print(result.group(1))
输出结果为:
我们只获取到了7这个数字,因为在贪婪模式下,.*会匹配尽可能多的字符并没有指定有多少个字符,所以把123456匹配了,给\d+留下一个满足条件的7。
我们改动一下
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+).*Demo$',content)
print(result)
print(result.group(1))
这样就匹配成功了
但是这里要注意,如果匹配字符串在结尾字符串,.*?就有可能匹配不到任何内容,因为它会匹配尽可能少的字符
content = 'http://weibo.com/comment/kEraCN'
result1 = re.match('http.*?comment/(.*?)',content)
result2 = re.match('http.*?comment/(.*)',content)
print('result1',result1.group(1))
print('result2',result2.group(1))
可以观察到,.*?没有匹配到任何结果,而.*则尽可能匹配更多的内容,成功得到了匹配结果