正则表达式
一、数据的分类
- 结构化数据
特点:数据以行为单位,每一个数据表示一个实体。每一行数据的属性都是一样的。
举例:关系型数据库中的表就是结构化数据。
处理方法:sql - 半结构化数据
特点:结构化数据的另一种形式。他并不符合关系型数据的特点,不能用关系型模型来描述,但是这种数据包含相关标记,有用来分割语义元素以及字段进行分层的描述。因此也被称为自描述结构。 - 非结构化数据
特点:没有固定结构的数据
举例:文档、图片、音频、视频
处理方法:常常用二进制形式来做整体保存
二、json数据
-
json是什么语言的内容?
json是js语言中用来用字符串格式来保存对象和数组的一种数据结构。
json数据本质上是字符串 -
js中数组和对象:
js的数组:var array = {‘aa’,‘bb’,‘cc’} ----和python列表相对应
js的对象:var obj = {name:‘zhangsan’,age:10} —和python字典相对应 -
json数据的解析方法:
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所对应的的文件中。4、json的意义:
json作为数据格式进行传输,具有较高的效率
json不像xml那样具有严格的闭合标签,所以json作为数据传输的时候,他的数据有效占比(有效数据和总数据的比)比xml高很多。
在相同流量下,json比xml作为数据传输,传输的数据更多。
三、正则表达式
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模块的使用。
python中re模块是用来做正则处理的。
(1)re模块的使用步骤:
#1导包
import re
#2将正则表达式编译成一个pattern对象
pattern = re.complie(
r’正则表达式’,
‘匹配模式’
)
r表示元字符。
#3、用pattern对象来使用相应的方法来匹配内容。(2)pattern对象的方法:
1.match方法:默认从头开始,只匹配一次,返回一个match对象。
pattern.match(
‘匹配的目标字符串’,
start,匹配开始的位置–缺省,start = 0
end,匹配结束的位置–缺省,end = -1
)—>match对象match对象的属性: 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中返回。 pattern.findall( '匹配的目标字符串', start,匹配开始的位置--缺省,start = 0 end,匹配结束的位置--缺省,end = -1 )--->list 4、finditer方法:全文匹配,匹配多次,返回一个迭代器。 pattern.finditer( '匹配的目标字符串', start,匹配开始的位置--缺省,start = 0 end,匹配结束的位置--缺省,end = -1 )--->list finditer主要用匹配内容比较多的情况下。 5、split:切分,按照正则所表示内容进行切分字符串,返回切分后的每个子串 pattern.split( '要切分的字符串', '切分字数',默认是全部分。 )--->list 6、sub方法:用指定字符串,替换正则表达所匹配到的内容。 pattern.sub( repl,#替换成什么 content,替换什么 count,替换次数,默认替换所有 )--->替换后的字符串。 repl替换内容可以使函数: 函数要求: 1.函数必须有参数,参数就是正则匹配目标字符串所得到的每个match对象。 2、这个函数必须要有返回值,返回值必须是字符串,这个字符串将来就作为替换的内容。 #zhangsan:3000,lisi:4000 #涨工资每个人涨1000 content = 'zhangsan:3000,lisi:4000' p = re.compile(r'\d+') result = p.sub(add,) 7、分组 分组在正则表达式中使用()来表示的,一个括号就是一个分组。 分组的作用: (1)筛选特定内容 (2)可以在同一个表达式中应用前面的分组: \1引用第一分组 (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、贪婪非贪婪模式 (1)贪婪和非贪婪的却别在于匹配内容的多少。 (2)贪婪使用*来控制匹配次数的。正则默认是贪婪。 (3)非贪婪使用?来控制的。 (4)在表示数量控制元字符后面加一个?,此时就表示这个数量控制符取最小值,也就是非贪婪。 9.匹配模式: re.S ----.可以匹配换行符 re.I----忽略大小写。