czh1303541051 发表于 2020-4-27 20:24:58

正则表达式

.*?这个表达式,大佬们能举个例子说下嘛,越详细越好,我百度了好久了,就是想不通,比如爬取某个网址的图片的时候,<img src="test.jpg" width="60px" height="80px"/>,这行

Hello. 发表于 2020-4-27 20:28:19

<img src="test.jpg" width="60px" height="80px"/>
src是图片地址
width是宽度
height是高度
数字就是多宽多高
px是单位

BngThea 发表于 2020-4-27 20:32:04

百度一下,正则的贪心与非贪心

czh1303541051 发表于 2020-4-27 20:42:04

Hello. 发表于 2020-4-27 20:28
src是图片地址
width是宽度
height是高度


我是想知道.*?在这里怎么来运作的

czh1303541051 发表于 2020-4-27 20:42:48

BngThea 发表于 2020-4-27 20:32
百度一下,正则的贪心与非贪心

看了,但是看不懂,转不过弯来,麻烦以这个为例解释一下

Hello. 发表于 2020-4-27 20:47:26

czh1303541051 发表于 2020-4-27 20:42
看了,但是看不懂,转不过弯来,麻烦以这个为例解释一下

https://zhuanlan.zhihu.com/p/81460886

悠悠2264 发表于 2020-4-27 21:03:46

本帖最后由 悠悠2264 于 2020-4-27 21:21 编辑

.表示任意一个字符(除换行符),*表示匹配前面的子表达式(也就是前面的.)0次或多次,?跟在.*后面则表示开启非贪婪模式。
非贪婪模式也就是匹配最少的字符,比如正则表达式:a.*?c,字符串是:abcdcba,匹配的就会是abc,而不是abcdc。

爬取图片的时候也就需要开启非贪婪模式(不开的话则会从第一个img标签匹配到最后的img标签),即在.*后加?,正则表达式如:<img src=".*?" width=".*?" height=".*?"/>

czh1303541051 发表于 2020-4-27 21:20:04

悠悠2264 发表于 2020-4-27 21:03
.表示任意一个字符(除换行符),*表示匹配前面的子表达式(也就是前面的.)0次或多次,?跟在.*后面则表示 ...

还是没看懂,真看不懂这东西,就以你这个例子来说,如果是a.*c,字符串会是啥

悠悠2264 发表于 2020-4-27 21:22:01

本帖最后由 悠悠2264 于 2020-4-27 21:26 编辑

czh1303541051 发表于 2020-4-27 21:20
还是没看懂,真看不懂这东西,就以你这个例子来说,如果是a.*c,字符串会是啥

会是:abcdc,多了dc,因为要求最后一个字符是c,这个是匹配最多的情况。
所以说贪婪模式(.*)是匹配最多的,非贪婪模式(.*?)匹配最少的

czh1303541051 发表于 2020-4-27 21:29:31

悠悠2264 发表于 2020-4-27 21:22
会是:abcdc,多了dc,因为要求最后一个字符是c,这个是匹配最多的情况。
所以说贪婪模式(.*)是匹配最 ...

'<li>.*?<img src = "(.*?)" width = .*?</li>'
那这又是什么意思,这是我看教程上讲师写得爬图片用的正则表达式,单单去看那些简单的例子我是能看懂,这个真看不懂

悠悠2264 发表于 2020-4-27 21:36:08

本帖最后由 悠悠2264 于 2020-4-27 21:38 编辑

czh1303541051 发表于 2020-4-27 21:29
'.*?

.*?就是匹配最少的字符,如果你不加问号,它就会从第一个<li>匹配到最后一个<img src = "(.*?)" width = .*?</li>,就等于是把所有的<li><img>标签都放在一个字符串里,而要求应该是吧每个<li><img>标签放到不同的字符串里,所有要加?,开启非贪婪模式。

加括号不加括号无所谓,没有优先级的问题,只是美观点

czh1303541051 发表于 2020-4-27 22:01:00

悠悠2264 发表于 2020-4-27 21:36
.*?就是匹配最少的字符,如果你不加问号,它就会从第一个匹配到最后一个

我貌似突然看懂了,一直理解不对,是不是这样理解
如:<img src="test.jpg" width="60px" height="80px"/>
懒惰模式正则:
src=".*?"
结果:src="test.jpg"
因为匹配到第一个"就结束了一次匹配。不会继续向后匹配。
这个.*?判断的不是.   是.前面的那个"    我一直以为判断的是.这个任意字符
是这样理解吗

悠悠2264 发表于 2020-4-27 22:32:20

本帖最后由 悠悠2264 于 2020-4-27 22:43 编辑

czh1303541051 发表于 2020-4-27 22:01
我貌似突然看懂了,一直理解不对,是不是这样理解
如:
懒惰模式正则:


?是非贪婪模式,不是贪婪模式,反掉了。匹配到src="test.jpg"是对的。
.是表示任意一个字符(除空格),不是文件名里的.
其他的理解是对的

czh1303541051 发表于 2020-4-27 23:48:19

悠悠2264 发表于 2020-4-27 22:32
?是非贪婪模式,不是贪婪模式,反掉了。匹配到src="test.jpg"是对的。
.是表示任意一个字符(除空格) ...

大哥你没看懂我意思,方便留个qq或者vx吗,感觉不实时指导我是看不懂这个正则表达式了

suchocolate 发表于 2020-4-28 09:15:26

看书吧,没书就看小甲鱼的https://fishc.com.cn/forum.php?mod=viewthread&tid=99281&extra=page%3D2&mobile=2

悠悠2264 发表于 2020-4-28 09:27:55

本帖最后由 悠悠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",也就是匹配最少的,越少越好。

czh1303541051 发表于 2020-4-28 09:38:53

悠悠2264 发表于 2020-4-28 09:27
我再讲详细点。

.是表示任意一个字符(除换行符),如字符串:char="a",正则表达式:char=".", ...

看懂了,谢大佬耐心解答

悠悠2264 发表于 2020-4-28 09:40:57

czh1303541051 发表于 2020-4-28 09:38
看懂了,谢大佬耐心解答

懂了就好{:10_297:}
页: [1]
查看完整版本: 正则表达式