Python爬虫:正则表达式
2020-01-14 12:42
351 查看
数据的分类
1. 结构化数据
- 特点:数据以行为单位,每一个数据表示一个实体,每一行数据的属性都是一样的
- 举例:关系型数据库中的表就是结构化数据
- 处理方法:sql
2. 半结构化数据
- 特点:结构化数据的另一种形式,并不符合关系型数据的特点,不能用关系型模型来描述,但是这种数据包含相关标记,有用来分割语义元素以及字段进行分层的描述。因此也被称为自描述结构。
- 举例:xml,html,json
- 处理方法:正则,xpath,jsonpath,css选择器
3. 非结构化数据
- 特点:没有固定结构的数据
- 举例:文档,图片,音频,视频
- 处理方法:常常用二进制形式来做整体保存
json数据
1. json是什么语言的内容?
- json 是js 语言中用字符串格式来保存对象和数组的一种数据结构
- json 数据本质上是字符串
2. js 中数组和对象
- js的数组:var array = [‘aaa’,‘bb’,‘cc’] — 和python列表对应
- js的对象:var obj = {name:‘zhangsan’,age:10}—和python字典对应。name = obj.name
3. json数据的解析方法
-
对json 字符串得操作
json.loads(json_str) ----> python的list或者dict json.dumps(python的list或者dict) ----> json_str
-
对json文件的操作
json.load(fp)--->从json文件中读出json数据,返回一个python的list或者dict json.dump(python的list或者dict,fp)---》python的list或者dict保存到fp所对应的的文件中。
-
json的意义
json 作为数据格式进行传输,具有较高的效率 json 不像xml 那样具有严格的闭合标签,所以json 作为数据传输的时候,他的数据有效占比(有效数据和总数据的比)比xml高很多。 在相同的流量下,json 比xml 作为数据传输,传输的数据多。
正则表达式
1. 元字符
匹配边界
符号 | 意义 |
---|---|
^ | 行首 |
$ | 行尾 |
重复次数
符号 | 意义 |
---|---|
? | 0次或者1次 |
* | 0次或者多次 |
+ | 一次或者多次 |
{n,} | n次或者更多次,至少n次 |
{n,m} | n - m次 |
{n} | n次 |
各种字符的表示
符号 | 意义 |
---|---|
[] | 匹配括号中一个字符,单字符 |
[abc] | 匹配 a 或者 b 或者 c |
[a-z0-9A-Z] | 对应取值范围的匹配 |
\d | 数字 |
\w | 数字字母下划线 |
\s | 空白字符:换行符,制表符,空格 |
\b | 单子边界 |
. | 除换行符意外的任意字符 |
2. re模块的使用
python 中的 re 模块是用来做正则处理的
2-1. re模块的使用步骤
-
导包:
import re
-
将正则表达式编译成一个pattern对象
pattern = re.compile( r'正则表达式', '匹配模式' ) r 表示元字符
-
用 pattern 对象来使用相应的方法来匹配内容。
2-2. pattern对象的方法
-
match方法
默认从头开始,只匹配一次
返回值:match对象pattern.match( '匹配的目标字符串', start,匹配开始的位置--缺省,start = 0 end,匹配结束的位置--缺省,end = -1 )
match对象的属性:
性 意义 atch.group() 获取匹配内容。 atch.span() 匹配的范围 atch.start() 开始位置 atch.end() 结束位置 atch.groups() 将所有分组的内容,按顺序放到一个元组中返回 -
search方法
从任意位置开始匹配,只匹配一次
返回值:match对象pattern.search( '匹配的目标字符串', start,匹配开始的位置--缺省,start = 0 end,匹配结束的位置--缺省,end = -1 )
-
findall方法
全文匹配,匹配多次,将每次匹配的结果放到list 中返回
返回值:listpattern.findall( '匹配的目标字符串', start,匹配开始的位置--缺省,start = 0 end,匹配结束的位置--缺省,end = -1 )
-
finditer方法
全文匹配,匹配多次,主要匹配内容比较多的情况
返回值:迭代器pattern.finditer( '匹配的目标字符串', start,匹配开始的位置--缺省,start = 0 end,匹配结束的位置--缺省,end = -1 )
-
split方法
切分,按照正则所表示内容进行切分字符串,返回切分后的每个字符串
返回值:listpattern.split( '要切分的字符串', '切分字数',默认是全部分。 )
-
sub方法
用指定字符串,替代正则表达式所匹配到的内容
返回值:替换之后新的字符串pattern.sub( repl,# 替换成什么内容 content,# 被替换的内容 count,# 替换次数,默认替换所有 )
repl 替换内容可以是函数
函数要求:
- 函数必须有参数,参数就是正则匹配目标字符串所得到的每个match对象
- 这个函数必须要有返回值,返回值必须是字符串,这个字符串将来就作为替换的内容
import re str1 = 'Ian:1111,Alaric:2222,Damon:3333' # 自定义sub的repl参数:add方法 def add(m): return str(int(m.group())+1111) content = str1 # 实例化pattern对象 p = re.compile(r'\d+') result = p.sub(add,content,) print(result) # Ian:2222,Alaric:3333,Damon:4444
-
分组
分组在正则表达式中使用 () 来表示,一个括号就是一个分组
分组的作用:
- 筛选特定内容
- 可以在同一个表达式中应用前面的分组: ‘\1’ 表示引用第一个分组
- findall 配合分组使用import re content = '<html><h1>正则表达式</h1></html>' p = re.compile(r'<(html)><(h1)>(.*)</\2></\1>') # print(p.search(content).group()) print(p.findall(content)) #[('html', 'h1', '正则表达式')]
-
贪婪非贪婪模式
贪婪和非贪婪的区别在于匹配内容的多少 - 贪婪是用 * 来控制匹配次数的,正则默认是贪婪模式
- 非贪婪是用 ? 来控制的。
- 在表示数量控制元字符后面加一个 ?,此时就表示这个数量控制符取最小值,也就是非贪婪。
import re pattern1 = re.compile(r'ab*') res1 = pattern1.findall('abbbc') pattern2 = re.compile(r'ab*?') res2 = pattern2.findall('abbbc') # * 表示最少0次,最多无限次匹配 # 在控制之数量的元字符 * 后面加上非贪婪 ? 之后,尽可能少的匹配 b,于是就匹配0次 print(res1) # ['abbb'] print(res2) # ['a'] s = 'aa<div>test1</div>bb<div>test2</div>cc' pattern = re.compile(r'<div>.*?</div>') result = pattern.findall(s) print(result) # ['<div>test1</div>', '<div>test2</div>']
- 匹配模式
匹配模式 | 意义 |
---|---|
re.S | ‘.’,点可以匹配换行符 |
re.I | 忽略大小写 |
re.M | 多行匹配,影响 ^ 和 $ |
- 通用匹配正则表达式
ps:需要配合 re.S 使用
import re content = '{name:"zhangsan",age:"10",hobby:["basktball","football","read"]}' pattern = re.compile(r'.*?"(.*?)".*?"(.*?)".*?') match = pattern.search(content) print(match) print(match.group(1)) print(match.group(2))
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- python3爬虫之入门和正则表达式
- 用python写网络爬虫-使用xpath代替正则表达式
- python3爬虫之入门和正则表达式,获取IP地址, 隐马尔可夫模型及其在分词中的简单应用
- python爬虫:正则表达式
- Python爬虫(十一)_案例:使用正则表达式的爬虫
- Python3.7 爬虫(一)使用 Urllib2 与正则表达式抓取
- 网络爬虫(六):Python中的正则表达式教程
- 转载——python和爬虫的正则表达式
- python 爬虫 正则表达式爬取猫眼电影top100榜
- Python爬虫--- 1.4 正则表达式:re库
- Python-爬虫6-页面解析和数据提取的方法、正则表达式
- 网络爬虫笔记【6】 Python 中的正则表达式模块与应用
- (转)Python爬虫学习笔记(2):Python正则表达式指南
- python 爬虫4:正则表达式介绍
- [python爬虫] 正则表达式使用技巧及爬取个人博客实例
- 把玩之python爬虫正则表达式
- 爬虫学习——正则表达式与python的re库(二)
- Python--正则表达式/单线程网络爬虫
- python爬虫学习实践(一):requests库和正则表达式之淘宝爬虫实战
- Python爬虫入门七之正则表达式