一. 数据的分类
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字典对应.
3. json数据的解析方法:
- json模块:
- 对json字符串的操作:
- json.loads(json_str)—>将已编码的 JSON 字符串解码为 Python 对象
- json.dumps( python的list或者dict)—>将 Python 对象编码成 JSON 字符串
- 对json文件的操作:
- json.load(fp) —> 从json文件中读出json数据, 返回一个Python的list或者dict
- json.dump(Python的list或者dict,fp)—> Python的list或者dict保存到fp所对应的文件中.
- 对json字符串的操作:
4. json的意义:
- json作为数据格式进行传输,具有较高的效率
- json不像xml那样具有严格的闭合标签,所以json作为数据传输的时候,他的数据有效占比比xml高很多.
- 在相同流量下,json比xml作为数据传输,传输的数据更多.
三. 正则表达式
1. 元字符
- 匹配边界:
^ | 行首 |
---|---|
$ | 行尾 |
- 重复次数
? | 0次或一次 |
---|---|
* | 大于等于0次 |
+ | 大于等于1次 |
{n,} | 大于等于n次 |
{n, m} | 大于等于n次,小于等于m次 |
{n} | 匹配n次 |
- 各种字符的表示
[] | 匹配括号中的一个字符,单字符 |
---|---|
[abc] | a或者b或者c |
[a-z0-9] | 所有小写字母或数字 |
\d | 数字 |
\w | 数字字母下划线 |
\s | 空白字符: 换行符,制表符,空格 |
\b | 单词边界 |
. | 除换行符之外的任意字符 |
2. re模块的使用
Python中re模块是用来做正则处理的.
-
re模块的使用步骤:
- 导包
import re
- 将正则表达式编译成一个pattern对象
pattern = re.complie(正则表达式, 匹配模式)
- 用pattern对象来使用相应的方法来匹配内容.
-
pattern对象的方法:
-
match方法: 默认从头开始,只匹配一次,返回一个match对象.
pattern.match(匹配的目标字符串, start=0, end=-1) # 返回一个match对象
match对象的属性:
match.group() # 获取匹配内容 match.span() # 获取匹配到值的范围 match.start() # 获取匹配到值的开始位置 match.end() # 获取匹配到值的结束位置 # 这些方法带参数0和不带参数是一样的,否则代表取分组 ```
-
search方法: 从任意位置开始匹配,只匹配一次,返回一个match对象
pattern.search(匹配的目标字符串, start=0, end=-1) # 返回一个match对象
-
findall方法: 全文匹配, 匹配多次,将每次匹配到的结果放到list中返回.
pattern.findall(匹配的目标字符串, start=0, end=-1) # 返回一个list对象
-
finditer方法: 全文匹配,匹配多次,返回一个迭代器.
pattern.finditer(匹配的目标字符串, start=0, end=-1) # 返回一个迭代器
-
split: 切分,按照正则所表示内容进行切分字符串,返回切分后的每个字符串,不包括正则部分
pattern.split(要切分的字符串, 最大切分次数默认全部切割) # 返回一个列表
-
sub方法: 用指定字符串替换正则表达式所匹配到的内容.
pattern.sub(repl, 要替换的字符串, 最大替换次数) # rel: 用来替换的字符串 # rel可以是字符串 # 也可以是id引用分组 # 也可以是函数,不过这个函数只接收一个match对象,并返回一个字符串 # 该方法返回值是一个字符串
-
分组
分组在正则表达式中使用()来表示,一个括号就是一个分组.
分组的作用:- 筛选特定内容
- 可以在同意个表达式中应用前面的分组:
\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', '正则表达式')]
-
贪婪非贪婪模式
- 贪婪和非贪婪的区别在于匹配内容的多少.
- 贪婪使用*来控制匹配次数的,正则默认是贪婪.
- 非贪婪使用?来控制
- 在表示数量控制的元字符后面加一个?,此时就表示这个数量控制符尽量匹配最小次数,也就是非贪婪
-
匹配模式
re.s 可以匹配换行符 re.i 忽略大小写 -