正则表达式

一、数据的分类

  1. 结构化数据
    a) 特点:数据以行为单位,每一个数据表示一个实体。每一行数据的属性都是一样的。
    b) 举例:关系型数据库中的表就是结构化数据。
    c) 处理方法:sql
  2. 半结构化数据
    a) 特点:结构化数据的另一种形式。他并不符合关系型数据的特点,不能用关系型模型来描述。但是这种数据包含相关标记,有用来分割语义元素以及字段进行分层的描述。
    b) 因此也被称为自描述结构。
    c) 举例:xml,html,json
    d) 处理方法:正则,xpath,jsonpath,css选择器。
  3. 非结构化数据
    a) 特点:没有固定结构的数据。
    b) 举例:文档、图片、音频、视频。
    c) 处理方法:常常用二进制形式来做整体保存。

二、json数据

  1. json是什么语言的内容?
    a) son是js语言中用来用【字符串格式】来保存对象和数组的一种数据结构。
    b) json数据本质上是字符串。
  2. js种数组和对象
    a) js的数组:var array = [‘aaa’,‘bb’,‘cc’]----和python列表对应
    b) js的对象:var obj = {name:‘zhangsan’,age:10}—和python字典对应。——name = obj.name
  3. 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所对应的的文件中。

  1. json的意义
    a) json作为数据格式进行传输,具有较高的效率
    b) json不像xml那样具有严格的闭合标签,所以json作为数据传输的时候,他的数据有效占比(有效数据和总数据的比)比xml高很多。
    c) 在相同流量下,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 = '

    正则表达式

    ' p = re.compile(r'<(html)><(h1)>(.*)') # print(p.search(content).group()) print(p.findall(content))#[('html', 'h1', '正则表达式')]
  8. 贪婪非贪婪模式
    (1)贪婪和非贪婪的却别在于匹配内容的多少。
    (2)贪婪使用*来控制匹配次数的。正则默认是贪婪。
    (3)非贪婪使用?来控制的。
    (4)在表示数量控制元字符后面加一个?,此时就表示这个数量控制符取最小值,也就是非贪婪。

  9. 匹配模式
    a) re.S ----.可以匹配换行符
    b) re.I----忽略大小写。

  10. 万能正则匹配表达式:.*?(尽可能少匹配任意内容)配合re.S

你可能感兴趣的:(正则表达式)