目录
基础知识讲解
'\w’匹配字母
\w用于匹配任意一个字母
import re
exp = ' waefwe12345www678wfwe '
re.findall('\w',exp)
'\d’匹配数字
\d用于匹配任意一个数字
import re
exp = ' waefwe12345www678wfwe '
re.findall('\d',exp)
'|'或匹配
import re
exp = ' ArrarrBrrbrr'
re.findall('A[a-z].|a[a-z].',exp)
'.'过滤
在python正则表达式中,一个"."可以代表任意一个字符,类似于?
例如我们想匹配到arr、acc、akk等带有a的单词
import re
exp='arraccakk'
re.findall('a..',exp)
过滤[a-z]举例
import re
exp='arraccakk'
re.findall('a..',exp)
空格过滤型
例如下面的exp中,每个词两边都有一个空格
import re
exp = ' arr acc akk '
re.findall(' a.. ',exp)
输出:
[' arr ', ' acc ', ' akk '] #引号里面是有空格的
去掉空格的写法:
re.findall(' (a..) ',exp)
[空]*号匹配 【重点】
[空格]*可以匹配到0-无穷多个空格
a*可以匹配到0-无穷多个a
补充:
a+可以匹配到至少一个a
a{2}可以匹配到刚好2个a
a{2,10}可以匹配2-10个a
import re
exp = ' ArrarrBrrbrr'
re.findall(' *[Aa]rr',exp)
输出结果:
[' Arrarr']
[例1] 在python软件中利用正则表达式替换值
例如,我们需要将如下代码的格式转换为字典
{
a:苹果
b:香蕉
c:菠萝
d:桃子
}
字典格式为:
{
"a":"苹果",
"b":"香蕉",
"c":"菠萝",
"d":"桃子"
}
数据量少可以进行手动添加。数据量多可以用正则表达式进行替换:
Ctri+r打开替换工具
(.*?):(.*) #匹配到格式上
"($1)":"($2)", #$1表示第一个值,$2表示第二个值
search()和match()
[例2] 取出指定位置数据
import re
exp='sfnwoefwefwifjwfoiwejof(我想要的数据在这里,想办法取出我)wijfiweofonoiwenoief'
re.findall(' *我.*',exp)[0][:16] #这里用到的是python数据切片,不懂切片请自行百度
[例3]爬虫中利用正则取出数据
import re #导入re模块
在网页源代码中提取出标签内的内容:
title = re.findall('<span class=title>(.*?)</span>',html_data)[0]
抓取windows._playinfo_=后面的内容(".“在python中有特殊含义,所以需要用”\"进行转义)
data = re.findall('<script>windows\._playinfo_=(.*?)</script>,html_data)[0]
[例4]记一次取出http://
某一次我想取出下列格式前面的http://或https://
https://1.1.1.1、http://1.1.1.1
re.search("://",ip).span()
span()会返回出该字符串出现的起始位置和最后出现的位置,输出结果如下图
所以可以这样写,这样ip[test:]就取到了://后面的内容了
test = re.search("://",ip).span()[1]
ip[test:]
html_data为网页源代码数据,[0]表示取第一个值,(.*?)表示进行匹配内容
[例5]记一次取接口
import re
a="../../../.../1aafds/adf"
aaa=re.search("/(\w|\d)",a).span()[0]
print(a[aaa:])
#结果:/1aafds/adf
.*?和.*的区别对比
.*?是非贪婪的,匹配的越少越好
.*是贪婪的,匹配的越广越好
对比:
>>> print(re.findall('a(.*?)b','a123ba123b'))
['123', '123']
>>> print(re.findall('a(.*)b','a123ba123b'))
['123ba123']
进阶分析:
1.匹配重复项
^(.+)$[\r\n](^\1$[\r\n]{0, 1})+
2.匹配身份证号
(\d{8}(0\d|10|11|12)([0-2]\d|30|31)\d{3}$)|(\d{6}(18|19|20)\d{2}(0[1-9]|10|11|12)([0-2]\d|30|31)\d{3}(\d|X|x))
相关视频:
十分钟快速入门正则表达式【推荐】
相关文章
正则表达式 re.findall 用法
正则表达式(.*?)和(.*)的区别
import pprint格式化输出模块
目前data为字符串,使用pprint可以格式化
一篇更详细的正则用法:
https://www.cnblogs.com/aaronthon/p/9435967.html