2020-04-18 今天我来总结一下正则表达式

话说这个正则,我的第一印象就是我在看到别人的爬虫代码的时候,别人提取网站用的.*?,不过我当时也不知道什么是正则,怎么用,为什么这么写,完全看不懂

下面我记录一下正则表达式的用法

首先,

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) ,这个用的比较多,可以对于要匹配的进行替换,然后输出

*当然,re.的用法还有很多,不过常见的就是这几种,好啦,今天的记录到此位置qwq
开心到哭泣,也不知道大佬什么时候可以带我爬虫qaq
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容