python爬虫(四)正则表达式 + 元字符 + pattern对象的相关方法 + 贪婪模式和禁止贪婪


一、正则表达式的必备知识


1. 正则表达式概念


正则表达式:又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。


2. 正则表达式的原理


给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

  • 给定的字符串是否符合正则表达式的过滤逻辑(“匹配”);
  • 通过正则表达式,从文本字符串中获取我们想要的特定部分(“过滤”)。
    在这里插入图片描述
    在这里插入图片描述

3. 数据的存储和分类


数据结构化分类的类别 介绍 常见类型
结构化数据 数据是以行为单位,一行数据表示一个实体的信息,每一行的数据的属性是相同的 常见关系型数据库中以表存储的数据就是结构化数据
半结构化数据 结构化数据的一种形式,并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔语义元素以及对记录和字段进行分层。因此他也被成为自描述的结构。 常见的有xml,html,json
非结构化数据 没有固定的结构,对于非结构数据,一般我们通过整体存储,而且一般存储为二进制存储 常见的非结构化数据有:文档,图片,视频

4. json数据


  • JSON是JS对象的字符串表达式,他使用文本形式表示一个JS对象的信息,本质是一个字符串。
  • js的对象就相当于python中的字典
  • js的数组就相当于Python中的列表

因为json用来存储js对象的对象或者数组,所以在python中我们可以将json转换为list或dict


5. 解析json的包


json.dumps(python的list或者dict)---->(返回值)---->json字符串

json.loads(json字符串)---->(返回值)----->python的list或者dict

json.dump(list/dict,fp)--->将python的list,或者字典保存到json文件中。

json.load(fp)--->list/dict:从json文件中读出json数据。

二、 正则表达式


1. 元字符


(1) 匹配边界

元字符 含义
^ 匹配行首
$ 匹配行尾

(2)重复次数

元字符 含义
0或1,要么出现,要么不出现
* 0-多次
+ 1-多次,至少一次
{n,} 大于等于n次
{n,m} 大于等于n次小于等于m次
{n} 重复n次

(3)各种字符的表示

元字符 含义
. 匹配除换行符以外的任意一个字符
\b 匹配单词的开始和结束
\B 匹配不是单词开始和结束的位置
\d 匹配数字
\D 匹配任意非数字的字符
\w 匹配字母,数字,下划线
\W 匹配任意不是字母,数字,下划线的字符
\s 匹配任意空白,包括空格,制表符(Tab),换行符
\S 匹配任意不是空白符的字符
[] 表示单字符
[abc] 匹配a、b、c其中的一个
[a-z] 匹配a-z中一个
[0-9a-zA-Z_] 匹配数字小写字母,大写字母中的一个
[^abc] 匹配除了abc的任意一个字符
\n 换行
() 组,若有P代表别名
[^(123|abc)] 匹配除了123或者abc这几个字符以外的任意字符

2. re模块的使用步骤


  1. 将正则表达式编译成一个pattern对象
 re.complie("正则表达式")  
  1. pattern提供一系列的方法,来对文本进行匹配,一般返回一个match对象
  2. 通过使用match对象提供的方法来获取匹配结果
match.group() #返回匹配对象
match.group(0)#获取匹配结果,结果同上
match.span() #获取匹配范围
match.start() #匹配开始位置
match.end() #匹配结束位置

示例:

import re

p = re.compile('\d+')
str = '12hello 456,a;b'
m1 = p.match(str)
print(m1)  # <_sre.SRE_Match object; span=(0, 2), match='12'>
print(m1.group())  # 12
print(m1.group(0))  # 12
print(m1.span())  # (0, 2)
print(m1.start())  # 0
print(m1.end())  # 2


3. pattern对象的方法


  1. match方法 :默认从头开始匹配,只匹配一次,返回一个match对象,返回匹配的第一个
pattern.match(
	'要匹配的字符串',必须指定;
	start,匹配的开始位置;(可选)
	end,匹配的结束位置(可选)
)------>返回**match对象**

match对象的方法

match对象的方法 作用
match.group() 获取匹配结果
match.group(0) 获取匹配结果,和上面结果一样
match.span() 获取匹配的范围 (返回元组,包含头,不包含结尾)
match.start() 匹配开始位置
match.end() 匹配结束位置

案例:
在这里插入图片描述

  1. search方法 :从任意位置匹配,只匹配一次,返回一个match对象;返回匹配的第一个
pattern.search(
	'要匹配的字符串',必须指定;
	start,匹配的开始位置;(可选)
	end,匹配的结束位置(可选)
)------>返回**match对象**

案例:
在这里插入图片描述

方法和match相同

  1. findall:全文匹配,将匹配到的结果放到一个list中返回给我们,多次匹配(用于内容少的字符串)
pattern.findall(
	'要匹配的字符串',必须指定;
	start,匹配的开始位置;(可选)
	end,匹配的结束位置(可选)
)---------->**返回list**

案例:
在这里插入图片描述

  1. finditer(一般用于内容多的字符串)全文匹配,多次匹配,返回一个包含匹配结果的迭代器
pattern.finditer(
	'要匹配的字符串',必须指定;
	start,匹配的开始位置;(可选)
	end,匹配的结束位置(可选)
)---------->**返回迭代器**

在这里插入图片描述

案例:
在这里插入图片描述

  1. split:切分字符串,按照整个表达式所指定的内容切分
字符串切分:str.split(',')
pattern.split(
	'要切分的字符串',  
	切分的次数。   ##不指定就是默认默认全部切分
)---------->**返回list**

案例:
在这里插入图片描述

  1. sub :用于替换,用指定的字符串,替换正则表达式匹配的到目标字符串的内容 返回字符串
pattern.sub(
	repl,    ## 替换成什么;要替换成什么数;可以是字符串也可以是函数
	content,   ## 要替换的内容
	count,   ## 可以不指定,替换的次数,默认全部替换
)

在这里插入图片描述

案例:
在这里插入图片描述

\1、\2等表示查找里面各个括号对应的匹配内容,也就是具体搜索到的内容。

repl可以是字符串也可以是函数

当repl是函数的时候,这个函数有以下要求

  1. 函数必须带一个参数,这个参数是一个match对象
def fun(match):
	"""
	对match对象的操作
	"""
	print(match.group)
  1. 当在sub方法里面传入这个参数时,这个match对象其实就是用正则匹配到的每一个match对象
  2. 这个函数是有返回值的,返回值必须是一个字符串,将来使用这个字符串进行替换目标字符串的

案例:函数方法1
在这里插入图片描述

注意:sub是更换要替换的内容,其他内容不变,还会保留

案例:函数方法2 对指定字符串进行增加
在这里插入图片描述


4. 正则表达式中的分组


分组时通过()来表示的,一个括号就表示一个分组。
在这里插入图片描述

分组筛选特定内容
import re
 
#定义了两个group,因为包含两个括号
m = re.match("(\w+) (\w+)", "Isaac Newton, physicist")
 
#group(0)就是匹配的整个结果
print(m.group(0))                           #输出结果为Isaac Newton
 
#group(1)是第一个group的值
print(m.group(1))                           #输出结果为Isaac
 
#group(2)是第二个group的值
print(m.group(2))                           #输出结果为Newton
 
 
#groups返回所有的group,以元组的形式
print(m.groups())                           #输出结果为('Isaac','Newton') 

分组的作用:


(1)筛选特定内容。
	取分组内容可以通过match对象的group方法来去。
	group(1)表示取正则表达式中第一个括号的内容,依次类推。
	import re

	content = '{name:"zhangsan",age:"10",hobby:["basktball","football","read"]}'
	pattern = re.compile(r'{name:"(\w+)",age:"(\d+)".+')
	match = pattern.search(content)
	print(match.group(1))#zhangsan
	print(match.group(2))#10
(2)可以在同一个表达式的后面引用前面的分组表达式。
	 s = "<html><h1>正则表达式</h1></html>"
	
	import re

	s = "<html><h1>正则表达式</h1></html>"
	pattern = re.compile(r'<(html)><(h1)>(.*)</\2></\1>')
	match = pattern.search(s)
	print(match.group(3))#正则表达式

5. 正则表达式的模式


pattern = re.compile(
	'正则表达式',
	‘正则表达式的模式’
)

正则表达式的模式有以下几种:

  • re.I 使匹配对大小写不敏感
  • re.M 多行匹配,影响 ^ 和 $
  • re.S 使 . 匹配包括换行在内的所有字符

6. 贪婪模式与非贪婪模式


*和?都是作用表示重复次数的元字符的
在这里插入图片描述

正则默认是贪婪模式,所以数量控制符默认是取最大值,也是贪婪

  • (1)贪婪是用控制的
  • (2)非贪婪是用?来控制
  • (3)和?都是作用表示重复次数的元字符的。
  • (4)正则默认是贪婪模式,所以数量控制符默认是取最大值,也是贪婪。
  • (5)在表示重复的元字符后面加一个?,此时就是非贪婪,取这个重复元字符的最小值。

案例:
*星号>=0
在这里插入图片描述

星号作用于b,?作用于星号*(在表示重复的元字符后面加一个?,此时是非贪婪,取这个重复元字符最小值)
在这里插入图片描述


7. 通用匹配正则表达式


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))


发布了107 篇原创文章 · 获赞 43 · 访问量 6148

猜你喜欢

转载自blog.csdn.net/langdei/article/details/102807409