通过requests库,我们可以轻易的获取到网页的源代码。但是如果想更精细化的提取我们想要的内容,就需要对内容进行解析了。

这个时候我们可以通过一个非常强大的工具来帮助我们 ---- 正则表达式

正则表达式:通过制定一些特殊的字符或者字符组合来过滤字符串,提取或者检索目标的内容。

正则匹配规则如下图所示,来源:CSDN

在Python中,re模块拥有全部的正则表达式的功能。下面介绍几个Re中常用的几个方

一、re.match

从字符串的起始位置开始匹配,如果是起始位置匹配成功返回相应字符,如果不是起始位置返回None

语法如下:

def match(pattern, string, flags=0):
  • pattern : 匹配的正则表达式

  • string :被匹配的字符串

  • flags :用于控制正则的匹配方式(如下表)

    修饰符 描述
    re.I 使匹配对大小写不敏感
    re.L 做本地化识别(locale-aware)匹配
    re.M 多行匹配,影响 ^ 和 $
    re.S 使 . 匹配包括换行在内的所有字符
    re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
    re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

匹配之后,会返回一个对象,可以通过group(num) 或者 groups() 获取对应字符串

import retext = 'Hello World, Hi Python'# 匹配Hello
m1 = re.match('Hello', text)
# 匹配Hi
m2 = re.match('Hi', text)
if m1:print(m1.group())
else:print('Hello 字符 匹配失败')if m2:print(m2.group())
else:print('Hi 字符 匹配失败')

执行结果:

因为Hello字符串在,text中在起始位置所以匹配成功,而Hi字符不在起始位置,所以返回None

Hello
Hi 字符 匹配失败

在正则表达式中,通过 () 来表示要提取的内容。

在下面的例子中,flags=re.I, 代表着匹配对大小写不敏感(忽略大小写)

text = 'Hello Python'
# . 代表匹配任意除换行以外的字符, * 表示匹配前一个字符(.)0次或多次
m1 = re.match(r'H(.*) p(.*)', text, re.I)
# 匹配整个表达式的字符串
print(m1.group()) # 'Hello Python'
# 返回一个包含所有小组字符串的元组
print(m1.groups()) # ('ello', 'ython')
# 获取第一个元素(从1开始)
print(m1.group(1))  # 'ello'
print(m1.group(2)) # 'ython'

二、re.search()

扫描整个字符并返回第一个匹配成功的

为匹配方便,能用search的时候就不要用match。因为search是匹配整个字符串,直到找到第一个匹配到的字符,而match开头如果匹配不到直接就返回了None。

import retext = "Nice to meet you Nice to meet all"s1 = re.search('meet (.*) ', text)
s2 = re.search('meet (.*?) ', text)print(s1.group())
print(s2.group())

输出结果:

meet you Nice to meet
meet you

这里需要注意的是 .*.*?

. 表示 匹配除换行符 \n 之外的任何单字符,*表示匹配前面的字符零次或多次。

默认情况下,Python是采用的贪婪模式,就是尽可能多的匹配更多的字符。

所以s1一直匹配到text字符串中最后一个空格。 也就是输出了meet you Nice to meet

如果加上?, 即.*? 则是表示懒惰匹配模式,就是尽可能少的匹配字符。所以s2遇到第一个空格之后就停止了匹配,所以输出meet you

三、re.findall()

在字符串中找到所有与正则匹配的字符串,返回一个列表。如果匹配失败,返回空列表

而match/search 只匹配一次

语法

def findall(pattern, string, flags=0):
import retext = 'Hello123Python678'
# 匹配字符串中的所有数字
result = re.findall(r'\d+', text)
print(result) # ['123', '678']

四、re.finditer

与findall类似,唯一的区别是返回的是一个迭代器

findall返回的是一个列表

语法

def finditer(pattern, string, flags=0)
import retext = 'Hello123Python678'
# 匹配字符串中的所有数字
result = re.finditer(r'\d+', text)
print(result) # <callable_iterator object at 0x02BAE700>
for i in result:print(i.group())

输出

<callable_iterator object at 0x00B7E640>
123
678

五、re.compile 函数

用于编译正则表达式,生成一个Patter对象,供match()、search()函数使用。

语法

def compile(pattern, flags=0):
  • pattern : 一个字符串形式的正则表达式

  • flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:

    • re.I 忽略大小写

    • re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境

    • re.M 多行模式

    • re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)

    • re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库

    • re.X 为了增加可读性,忽略空格和 # 后面的注释

pattern.search/match/findall(string, pos: int, endpos: int = ...)
  • string: 等待匹配的字符串

  • pos:可选参数,指定字符串的起始位置,默认为0

  • endpos:可选参数,指定字符串的结束位置,默认为字符串的长度

如下

import retext = 'Hello123Python678'
pattern = re.compile(r'\d+')f1 = pattern.findall(text)
# 从下标为6的地方开始匹配
f2 = pattern.findall(text, 6)
# 匹配到下标为8的地方 停止
f3 = pattern.findall(text, endpos=8)
print(f1) # ['123', '678']
print(f2) # ['23', '678']
print(f3) # ['12']

爬虫系列 | 5、详解爬虫中正则的用法相关推荐

  1. python正则匹配空格+数字+空格_详解Python中正则匹配TAB及空格的小技巧

    详解Python中正则匹配TAB及空格的小技巧 发布时间:2020-10-15 08:38:48 来源:脚本之家 阅读:94 作者:杰瑞26 在正则中,使用.*可以匹配所有字符,其中.代表除\n外的任 ...

  2. html nthchild作用,详解CSS中:nth-child的用法

    前端的哥们想必都接触过css中一个神奇的玩意,可以轻松选取你想要的标签并给与修改添加样式,是不是很给力,它就是":nth-child". 下面我将用几个典型的实例来给大家讲解:nt ...

  3. php simplexml_load_file 详解,php中simplexml_load_file函数用法实例讲解

    php中simplexml_load_file函数用法实例讲解 发布于 2015-02-07 06:53:40 | 136 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文 ...

  4. html里position属性,科技常识:详解html中 position属性用法(四种)

    今天小编跟大家讲解下有关详解html中 position属性用法(四种) ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关详解html中 position属性用法(四种) 的相关资料,希望小 ...

  5. python中的super用法详解_Python中super函数用法实例分析

    本文实例讲述了python中super函数用法.分享给大家供大家参考,具体如下: 这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简 ...

  6. 详解python中的用法_详解python中*号的用法

    1.表示乘号 2.表示倍数,例如: def T(msg,time=1): print((msg+' ')*time) T('hi',3) 打印结果(打印3次): hi hi hi 3.单个 * (1) ...

  7. python两个乘号_详解python中*号的用法!(含实例:零基础也看能懂)

    前言: 今天为大家带来的内容是python中*号的用法,文中通过代码给大家介绍了双星号(**)的用法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下. 1.表示乘号 2.表示倍数,例如: de ...

  8. python argparse模块详解_python中argparse模块用法实例详解

    本文实例讲述了python中argparse模块用法.分享给大家供大家参考.具体分析如下: 平常在写命令行工具的时候,经常会带参数,所以用python中的argparse来实现. # -*- codi ...

  9. matlab sort descend,详解Matlab中 sort 函数用法

    搜索热词 (1)B=sort(A) 对一维或二维数组进行升序排序,并返回排序后的数组,当A为二维时,对数组每一列进行排序. eg: A=[1,5,3],则sort(A)=[1,3,5] A=[1,3; ...

  10. sort函数降序排列matlab,详解Matlab中 sort 函数用法

    (1)B=sort(A) 对一维或二维数组进行升序排序,并返回排序后的数组,当A为二维时,对数组每一列进行排序. eg: A=[1,5,3],则sort(A)=[1,3,5] A=[1,5,3;2,4 ...

最新文章

  1. 通用双谐振固态特斯拉驱动器 UD2.7
  2. 5.spring boot使用FastJson解析JSON数据
  3. Cllimbing Stairs [LeetCode 70]
  4. React的组件中的传值,及context上下文的使用
  5. python123平台作业答案第十二周_【2018年 网鼎杯CTF 第二场】红日安全-网鼎杯WriteUp(24日 更新:web详解)...
  6. php selected,php-多个选择字段-多次使用selected =“ selected”
  7. 迁移传统.net 应用到.net core [视频]
  8. os是android5.0,Funtouch OS 2.1曝光 完美改Android5.0
  9. Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量
  10. sublime3快捷键
  11. JavaScript对象的常用属性及使用
  12. IT公司是怎样面试的? (转载)
  13. 电脑连接西门子S7-200CPU的步骤
  14. nxlog以syslog方式发送日志
  15. 【新知实验室 腾讯云TRTC实时音视频体验】
  16. 周九常:个人知识管理的三个重点领域
  17. 爬虫项目实操四、用Scrapy爬取招聘网站的招聘信息
  18. 对话周傲英:数据库人的切肤之痛
  19. UVALive 7308 Tom and Jerry 猫抓老鼠 物理题
  20. 制动电阻 DF8B型机车电阻制动装置-奥创电子

热门文章

  1. mybatis-mysql操作存储过程
  2. 肌肉型小腿的瘦腿方案
  3. 运营商级NAT(Carrier-grade NAT)
  4. 阿里云轻量应用服务器闲置时间过长自动断开连接
  5. 两边双虚线是什么意思_行车道上双实线中又有双虚线是什么意思?
  6. 数据缺失,数据异常,数据标准化的处理方法
  7. QQ自定义音乐卡片代码
  8. leaflet鼠标进出事件 mouseover和mouseout (示例代码009)
  9. 七大设计原则之合成复用原则
  10. Mybaits中association的用法详解