第三讲 正则表达式
一、数据的分类
-
1,结构化数据
特点:数据以行为为单位,每一个数据表示一个实体,每一行数据的属性都是一样的。
举例:关系型数据库中的表就是结构化数据。
处理方法:sql
2,半结构化数据
特点:结构化数据的另一种型式。它并不符合关系型数据的特点,不能用关系型模型来描述,但是这种数据包含相关标记有用来分割语义元素以及字段进行分层的描述,因此也被称为自描述结构。
举例:xml、html、json
处理方法:正则,xpath,jsonpath,css选择器 3,非结构化数据:
特点:没有固定结构的数据,
举例:文档、图片、音频、视频。
处理方法:常常用二进制形式来做整体保存。写出结构化与半结构化的区别? (5分)
二、json数据
1、json是什么语言的内容?(2分)
json是js语言中用【字符串格式】来保存对象和数组的一种数据结构。
json数据本质上是字符串。
2,js中数组和对象:(2分)
1,js的数组:var array = ['aaa','bbb','cc']--和python列表对应
2,js的对象:var obj =[name:'zhangsan',age:10)--和python字典对应
name = obj.name
3,json数据的解析方法:(5分)
json模块:
json.loads(json_str)---python的list或者dict
json.dumps(python的list或者dict)--->json_str
-------
对json文件的操作:
json.loads(fp)--->从json文件中读出json数据,返回一个python的list或者dict
json.dump(python的list或者dict,fp--->python的list或者dict保存到fp所对应的文件中。
4,json的意义:(2分)
json作为数据格式进行传输,具有较高的效率
json不像xml那样具有严格的闭合标签,所以json作为数据传输的时候,它的数据有效占比(有效数据和总数据的比)比xml高很多。
在相同流量下,json比xml作为数据传输,传输的数据更多。
三、正则表达式 (10分)
1,元子符
(1)匹配边界:
^----行首
$----行尾
(2)重复次数
?----0次或1次
*---->=0
+---->=1
{n,}-->=n
{n,m}-->=n,<=m
{n}----n次
(3)各种字符的表示
[]---匹配括号中一个字符,单字符
[abc]--匹配a或者b或者c
[a-z0-9A-Z]
\d--数字
\w--数字字母下划线
\s--空白字符:换行符,制表符,空格
\b--单词边界
.--除换行符以外的任意字符
2,re模块的使用。(2分)
python中re模块是用来做正则处理的。
*(1)re模块的使用步骤:*
1,导包
**2,将正则表达式编译成一个patten对象**
**3,用patten对象来使用相应的方法来匹配内容。**
import re
patten = re.complie(
r'正则表达式',
'匹配模式',
)r表示元子符。
(2)patten对象的方法:(2分)
1,match方法:默认从头开始,只匹配一次,返回一个match对象。
patten.match(
start,匹配开始的位置--缺省,start = 0
end,匹配结束的位置--缺省,end = -1
)--match对象
match对象的属性:(6分)
match.group()--获取匹配内容
match.span()--匹配的范围
match.start()--开始位置
match.end()--结束位置
这些方法都可以带一个参数0,但是不能写1,1来表示分组。
match.group(0)--获取匹配内容。
match.span(0)--匹配的范围
match.start(0)--开始位置
match.end(0)--结束位置
match.groups()---将所有分组的内容,按程序放到一个元组中返回
2、search方法:从任意位置开始匹配,只匹配一次,返回一个match对象
pattern.search(
'匹配的目标字符串',
start,匹配开始的位置--缺省,start = 0
end,匹配结束的位置--缺省,end = -1
)--->match对象
3、findall方法:全文匹配,匹配多次,将每次匹配到的结果放到list中返回。(2分)
pattern.findall(
'匹配的目标字符串',
start,匹配开始的位置--缺省,start = 0
end,匹配结束的位置--缺省,end = -1
)--->list
4、finditer方法:全文匹配,匹配多次,返回一个迭代器。(2分)
pattern.finditer(
'匹配的目标字符串'
start,匹配开始的位置--缺省,start =0
end,匹配结束的位置--缺省,end = -1
)-->list
5、split:切分,按照正则所表示内容进行切分字符串,返回切分后的每个子串(2分)
pattern.split(
’匹配的目标字符串‘,
'要切分字数,默认是全部份'
)---list
6、sub方法:用指定字符串,替换正则表达式所匹配到到内容。(2分)
pattern.sub(
rep1,#替换成什么
content,替换什么
count,替换次数,默认是替换所有
)--->替换后的字符串
rep1替换内容可以是函数:
函数要求:
1,函数必须有参数:参数就是正则匹配目标字符串所得到到每个match对象。
2,这个函数必须要有返回值,返回值必须是字符串,这个字符串将来作为替换的内容。
7,分组 分组在正则表达式中使用()来表示的,一个括号一个分组 分组的作用: (5分)
(1)筛选特定内容
(2)可以在同一个表达式中应用前面的分组:\引用第一分组
(3)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', '正则表达式')]
8,贪婪和非贪婪模式 (8分)
(1)贪婪和非贪婪的区别在于匹配内容的多少。
(2)贪婪使用*来控制匹配次数的。正则默认是贪婪。
(3)非贪婪使用?来控制的。
(4)在表示数量控制元字符后面加一个?,此时就表示这个数量控制符取最小值,也就是非贪婪。
9,匹配模式
re.S ----.可以匹配换行符
re.I----忽略大小写。
10、万能匹配表达式:.*?(尽可能少匹配任意内容)配合re.s