正则表达式
.*?这个表达式,大佬们能举个例子说下嘛,越详细越好,我百度了好久了,就是想不通,比如爬取某个网址的图片的时候,<img src="test.jpg" width="60px" height="80px"/>,这行 <img src="test.jpg" width="60px" height="80px"/>src是图片地址
width是宽度
height是高度
数字就是多宽多高
px是单位 百度一下,正则的贪心与非贪心 Hello. 发表于 2020-4-27 20:28
src是图片地址
width是宽度
height是高度
我是想知道.*?在这里怎么来运作的 BngThea 发表于 2020-4-27 20:32
百度一下,正则的贪心与非贪心
看了,但是看不懂,转不过弯来,麻烦以这个为例解释一下 czh1303541051 发表于 2020-4-27 20:42
看了,但是看不懂,转不过弯来,麻烦以这个为例解释一下
https://zhuanlan.zhihu.com/p/81460886 本帖最后由 悠悠2264 于 2020-4-27 21:21 编辑
.表示任意一个字符(除换行符),*表示匹配前面的子表达式(也就是前面的.)0次或多次,?跟在.*后面则表示开启非贪婪模式。
非贪婪模式也就是匹配最少的字符,比如正则表达式:a.*?c,字符串是:abcdcba,匹配的就会是abc,而不是abcdc。
爬取图片的时候也就需要开启非贪婪模式(不开的话则会从第一个img标签匹配到最后的img标签),即在.*后加?,正则表达式如:<img src=".*?" width=".*?" height=".*?"/> 悠悠2264 发表于 2020-4-27 21:03
.表示任意一个字符(除换行符),*表示匹配前面的子表达式(也就是前面的.)0次或多次,?跟在.*后面则表示 ...
还是没看懂,真看不懂这东西,就以你这个例子来说,如果是a.*c,字符串会是啥 本帖最后由 悠悠2264 于 2020-4-27 21:26 编辑
czh1303541051 发表于 2020-4-27 21:20
还是没看懂,真看不懂这东西,就以你这个例子来说,如果是a.*c,字符串会是啥
会是:abcdc,多了dc,因为要求最后一个字符是c,这个是匹配最多的情况。
所以说贪婪模式(.*)是匹配最多的,非贪婪模式(.*?)匹配最少的 悠悠2264 发表于 2020-4-27 21:22
会是:abcdc,多了dc,因为要求最后一个字符是c,这个是匹配最多的情况。
所以说贪婪模式(.*)是匹配最 ...
'<li>.*?<img src = "(.*?)" width = .*?</li>'
那这又是什么意思,这是我看教程上讲师写得爬图片用的正则表达式,单单去看那些简单的例子我是能看懂,这个真看不懂 本帖最后由 悠悠2264 于 2020-4-27 21:38 编辑
czh1303541051 发表于 2020-4-27 21:29
'.*?
.*?就是匹配最少的字符,如果你不加问号,它就会从第一个<li>匹配到最后一个<img src = "(.*?)" width = .*?</li>,就等于是把所有的<li><img>标签都放在一个字符串里,而要求应该是吧每个<li><img>标签放到不同的字符串里,所有要加?,开启非贪婪模式。
加括号不加括号无所谓,没有优先级的问题,只是美观点 悠悠2264 发表于 2020-4-27 21:36
.*?就是匹配最少的字符,如果你不加问号,它就会从第一个匹配到最后一个
我貌似突然看懂了,一直理解不对,是不是这样理解
如:<img src="test.jpg" width="60px" height="80px"/>
懒惰模式正则:
src=".*?"
结果:src="test.jpg"
因为匹配到第一个"就结束了一次匹配。不会继续向后匹配。
这个.*?判断的不是. 是.前面的那个" 我一直以为判断的是.这个任意字符
是这样理解吗 本帖最后由 悠悠2264 于 2020-4-27 22:43 编辑
czh1303541051 发表于 2020-4-27 22:01
我貌似突然看懂了,一直理解不对,是不是这样理解
如:
懒惰模式正则:
?是非贪婪模式,不是贪婪模式,反掉了。匹配到src="test.jpg"是对的。
.是表示任意一个字符(除空格),不是文件名里的.
其他的理解是对的 悠悠2264 发表于 2020-4-27 22:32
?是非贪婪模式,不是贪婪模式,反掉了。匹配到src="test.jpg"是对的。
.是表示任意一个字符(除空格) ...
大哥你没看懂我意思,方便留个qq或者vx吗,感觉不实时指导我是看不懂这个正则表达式了 看书吧,没书就看小甲鱼的https://fishc.com.cn/forum.php?mod=viewthread&tid=99281&extra=page%3D2&mobile=2 本帖最后由 悠悠2264 于 2020-4-28 09:33 编辑
czh1303541051 发表于 2020-4-27 23:48
大哥你没看懂我意思,方便留个qq或者vx吗,感觉不实时指导我是看不懂这个正则表达式了
我再讲详细点。
.是表示任意一个字符(除换行符),如字符串:char="a",正则表达式:char=".",就会匹配到char="a"。
.*表示匹配多个字符(除换行符)并开启贪婪模式。如字符串:str="this is a string",正则表达式:str=".*",则就会匹配到str="this is a string"
但如果字符串是:str="this is a string" char="a",这样他就会匹配到所有的,也就是:str="this is a string" char="a",这就是贪婪模式,匹配最多的,越多越好,恨不得全部匹配了。
是.*?的话,这就表示匹配多个字符(除换行符)并开启非贪婪模式,如字符串:str="this is a string" char="a",正则表达式:str=".*?",他就会匹配:str="this is a string",也就是匹配最少的,越少越好。
悠悠2264 发表于 2020-4-28 09:27
我再讲详细点。
.是表示任意一个字符(除换行符),如字符串:char="a",正则表达式:char=".", ...
看懂了,谢大佬耐心解答 czh1303541051 发表于 2020-4-28 09:38
看懂了,谢大佬耐心解答
懂了就好{:10_297:}
页:
[1]