话说这个正则,我的第一印象就是我在看到别人的爬虫代码的时候,别人提取网站用的.*?,不过我当时也不知道什么是正则,怎么用,为什么这么写,完全看不懂
下面我记录一下正则表达式的用法
首先,
import re
my_str = '我在哪,我在车上'
mytest = re.findall(r'',my_str)
基本框架如上第三行,我们需要在 r '这里写你的正则表达式'
一、关于re.findall(r'',str)
一、基本用法
比如
1、
import re
my_str = '我在哪,我在车上'
mytest = re.findall(r'我在',my_str)
print(mytest)
这里我们看到我么你的my_str有两个'我在',所以输出结果是

看我!我把my_str里面所有的'我在'都找出来了!
2、
import re
my_str = '我在哪,我在车上'
mytest = re.findall(r'我在.',my_str)
print(mytest)
这里我们添加了一个 . ,这个点叫做通配符(当然我们如果加2个效果就是两个)

.是为了匹配'我在' 和 后面的一个字符
3、
import re
my_str = '我1在哪3,我4在车5上67'
mytest = re.findall(r'[0-9]',my_str)
print(mytest)
[]可以用来寻找数字,0-9表示范围

当然不在这个范围内的就不会提取出来
二、这里介绍一下几个特殊的符号用法 锚点元字符 ^ 和 $*
import re
my_str = '我1在哪3,我4在车5上67'
mytest = re.findall(r'^我',my_str)
print(mytest)

相对前面加一个^,表示从第一个匹配'我'
import re
my_str = '我1在哪3,我4在车5上67'
mytest = re.findall(r'我$',my_str)
print(mytest)

在my_str最后寻找'我',然鹅最后是67,显然找不到
我们看看^和&一起用是什么效果
import re
my_str = '我'
mytest = re.findall(r'^我$',my_str)
print(mytest)

只有my_str这样才能找到满足头尾都是'我'的字符串
三、单词边界\b
import re
my_str = 'welcome to my class andwelcome looking'
mytest = re.findall(r'\bwelcome\b',my_str)
print(mytest)

通常情况下,英文单词一般是按空格隔开的,所以\b的用法就是用来判断取英语单词,像我上面的例子就是取'welcome' (所以welcom前后都加了边界)
四、控制次数{}
import re
my_str = 'welcome toooooooooooa my class andwelcome looking'
mytest = re.findall(r'to{11}',my_str)
print(mytest)

上面的{11}是对于o的次数控制,是为了节省时间,提高效率
当然,{}也可以是范围, 如
import re
my_str = 'welcome toooooooooooa my class andwelcome looking'
mytest = re.findall(r'to{2,11}a',my_str)
print(mytest)

这里就举的关于o{2,11}的例子
五、* + ? 的使用
1、*
import re
my_str = 'welcome toooooooooooa my class andwelcome looking'
mytest = re.findall(r'to*a',my_str)
print(mytest)

*其实和{}控制次数差不多,只是它是表示匹配o的任意多个而已
2、 + 我们来看看它和*有何不同
import re
my_str = 'welcome toooooooooooa my class andwelcome looking'
mytest = re.findall(r'to+a',my_str)
print(mytest)

表面上看上去没区别呀!但是其实是有区别的,*代表任意多个(包含0个),而+不是,如果这里没有o,则该正则表达式找不到所匹配字符
3、 ? 继续上代码!
import re
my_str = 'welcome toooooooooooa my class andwelcome looking'
mytest = re.findall(r'to?a',my_str)
print(mytest)

这个时候我们发现没匹配到!原因很简单,o?只能匹配0个或者1个,多于1个就不行!
六、 | 的使用
import re
my_str = 'welcome to my class to andwelcome welcome class looking'
mytest = re.findall(r'welcome|to|class',my_str)
print(mytest)

满足其中之一(用 | 隔开的为一个),就匹配
七、字符组 []
import re
my_str = 'wawaa wawab wawac wawad'
mytest = re.findall(r'wawa[acd]',my_str)
print(mytest)

[]里面是随机之一,符合就匹配
[0-9]或者[a-z]或者[A-Z]更可以[A-Za-z0-9]一起用都是可以的!另外啰嗦一句与之相反的是[^A-Za-z0-9]

这里顺便插入一下,只是已经定义好了的,可以直接使用了

贪婪模式和非贪婪模式,一般来说默认贪婪模式
另外,说一下关于re. 的其他用法
1、re.match #从一开始进行匹配,第一个如果是的话返回一个对象和一个位置
2、re.search #若有,则从文本中返回找到的第一个的匹配值的对象和位置
3、re.sub(r'替换前','替换后',str) ,这个用的比较多,可以对于要匹配的进行替换,然后输出

开心到哭泣,也不知道大佬什么时候可以带我爬虫qaq