爬虫之正则表达式

个人主页:Lei宝啊 

愿所有美好如期而遇


概念:

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),正则匹配是一个模糊的匹配(不是精确匹配)

如下四个方法经常使用:

  • match()
  • search()
  • findall()
  • finditer()

匹配单个字符或数字: 

匹配说明
.匹配除换行符以外的任意字符,当flags被设置为re.S时,可以匹配包含换行符以内的所有字符
[]里面是字符集合,匹配[]里任意一个字符
[0123456789]匹配任意一个数字字符
[0-9]匹配任意一个数字字符
[a-z]匹配任意一个小写英文字母字符
[A-Z]匹配任意一个大写英文字母字符
[A-Za-z]匹配任意一个英文字母字符
[A-Za-z0-9]匹配任意一个数字或英文字母字符
[^lucky][]里的^称为脱字符,表示非,匹配不在[]内的任意一个字符
^[lucky]以[]中内的某一个字符作为开头
\d匹配任意一个数字字符,相当于[0-9]
\D匹配任意一个非数字字符,相当于[^0-9]
\w匹配字母、下划线、数字中的任意一个字符,相当于[0-9A-Za-z_]
\W匹配非字母、下划线、数字中的任意一个字符,相当于[^0-9A-Za-z_]
\s匹配空白符(空格、换页、换行、回车、制表),相当于[ \f\n\r\t]
\S匹配非空白符(空格、换页、换行、回车、制表),相当于[^ \f\n\r\t]

匹配锚字符

锚字符:用来判定是否按照规定开始或者结尾

匹配说明
^行首匹配,和[]里的^不是一个意思
$行尾匹配
\A匹配字符串的开始,和^的区别是\A只匹配整个字符串的开头,即使在re.M模式下也不会匹配其他行的行首
\Z匹配字符串的结尾,和$的区别是\Z只匹配整个字符串的结尾,即使在re.M模式下也不会匹配其他行的行尾

限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。

有 *  或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。

匹配说明
(xyz)匹配括号内的xyz,作为一个整体去匹配 一个单元 子存储
x?匹配0个或者1个x,非贪婪匹配
x*匹配0个或任意多个x
x+匹配至少一个x
x{n}确定匹配n个x,n是非负数
x{n,}至少匹配n个x
x{n,m}匹配至少n个最多m个x
x|y|表示或的意思,匹配x或y

re模块中常用函数

通用flags(修正符)

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

通用函数

  • 获取匹配结果

    • 使用group()方法 获取到匹配的值

    • groups() 返回一个包含所有小组字符串的元组(也就是自存储的值),从 1 到 所含的小组号。 

match()函数

  • 原型

    def match(pattern, string, flags=0)
  • 功能

    匹配成功返回 匹配的对象

    匹配失败 返回 None

  • 获取匹配结果

    • 使用group()方法 获取到匹配的值

    • groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

  • 注意:从第一位开始匹配 只匹配一次

  • 参数

    参数说明
    pattern匹配的正则表达式(一种字符串的模式)
    string要匹配的字符串
    flags标识位,用于控制正则表达式的匹配方式

举例说明:

import re

str1 = '124jfda\n'
str2 = '\n124jfda'

print(re.match(".",str1))
print(re.match(".",str2))
print(re.match(".",str2,re.S))

search()函数

  • 原型

    def search(pattern, string, flags=0)
  • 功能

    扫描整个字符串string,并返回第一个pattern模式成功的匹配

    匹配失败 返回 None

  • 参数

    参数说明
    pattern匹配的正则表达式(一种字符串的模式)
    string要匹配的字符串
    flags标识位,用于控制正则表达式的匹配方式
  • 注意:

    只要字符串包含就可以

    只匹配一次

  • 示例

    str1 = '124jfda\n'
    str2 = '\n124jfda'
    
    print(re.search(".",str1))
    print(re.search(".",str2))
    print(re.search(".",str2,re.S))

  • 注意

    与search的区别

    相同点:

    都只匹配一次

    不同点:

    • search是在要匹配的字符串中 包含正则表达式的内容就可以
    • match 必须第一位就开始匹配 否则匹配失败

findall()函数(返回列表)

  • 原型

    def findall(pattern, string, flags=0)
  • 功能

    扫描整个字符串string,并返回所有匹配的pattern模式结果的字符串列表

  • 参数

    参数说明
    pattern匹配的正则表达式(一种字符串的模式)
    string要匹配的字符串
    flags标识位,用于控制正则表达式的匹配方式

 举例:

import re

str = '13678324489'
print(re.findall("[14]",str))
print(re.findall("1[0-9]",str))
print(re.findall("1[0-9]{10}$",str))
print(re.findall("1[0-9]{9}$",str))

贪婪与非贪婪模式

贪婪:       .*

非贪婪:   .*?

str = "<b>加粗</b><b>加粗的</b><b>加粗的的</b>"
val1 = re.search('<b>.*</b>',str)  #贪婪
val2 = re.search('<b>.*?</b>',str) #非贪婪

print(val1.group())
print(val2.group())

myStr = """
<a href="http://www.baidu.com">百度</a>
<A href="http://www.taobao.com">淘宝</A>
<a href="http://www.id97.com">电
影网站</a>
<i>我是倾斜1</i>
<i>我是倾斜2</i>
<em>我是倾斜2</em>
"""

#提取网址和名字
lt = re.findall('<a href="(.*?)">(.*?)</a>',myStr,re.S|re.I)
print(lt)

finditer()函数

  • 原型

    def finditer(pattern, string, flags=0)
  • 功能

    与findall()类似,返回一个迭代器

  • 参数

    参数说明
    pattern匹配的正则表达式(一种字符串的模式)
    string要匹配的字符串
    flags标识位,用于控制正则表达式的匹配方式

 举例:

import re

ret = re.finditer('\d', '12456789')
print(ret)
print(next(ret))

for i in ret:
    print(i)

split()函数(返回值为列表)

  • 作用:切割字符串

  • 原型:

    def split(patter, string, maxsplit=0, flags=0)
  • 参数

    pattern 正则表达式

    string 要拆分的字符串

    maxsplit 最大拆分次数 默认拆分全部

    flags 修正符

示例:

import re

myStr = "asdas\rd&a\ts12d\n*a3sd@a_1sd"
#通过特殊字符 对其进行拆分 成列表

#非字母拆分
res = re.split("[^a-z]",myStr)
print(res)

res = re.split("\W",myStr)
print(res)

正则高级

分组&起名称

  • 概念

    处理简单的判断是否匹配之外,正则表达式还有提取子串的功能,用()表示的就是要提取的分组

  • 说明

    • 正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来
    • group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串

示例:

import re

s = '3G4HFD567'

#格式:?P<别名>  ()里内容表示要提取的分组
x = re.match("(?P<value>\d+)",s)
print(x.group(0))
print(x.group('value'))

编译

  • 概念

    当在python中使用正则表达式时,re模块会做两件事,一件是编译正则表达式,如果表达式的字符串本身不合法,会报错。另一件是用编译好的正则表达式提取匹配字符串

  • 编译优点

    如果一个正则表达式要使用几千遍,每一次都会编译,出于效率的考虑进行正则表达式的编译,就不需要每次都编译了,节省了编译的时间,从而提升效率

  • compile()函数

    • 原型

      def compile(pattern, flags=0)
    • 作用

      将pattern模式编译成正则对象

    • 参数

      参数说明
      pattern匹配的正则表达式(一种字符串的模式)
      flags标识位,用于控制正则表达式的匹配方式
    • flags

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

      编译好的正则对象

示例:

import re

str = '123456'
pattern = re.compile("\d")
print(pattern.search(str))

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/395599.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AutoMQ 社区双周精选第七期(2024.01.29~2024.02.09)

本期概要 过去的两周里&#xff0c;社区贡献者lifepuzzlefun 为 AutoMQ 的 RocketMQ 项目优化了 LogCache 的二分查找性能&#xff0c;消除了不必要的List拷贝。 同时&#xff0c;AutoMQ 的主干动态展示了持续的性能优化和功能增强。在 Kafka 项目中&#xff0c;团队设计了新…

【Postgres】11、PROCEDURE 存储过程、FUNCTION 函数、使用方式和区别

文章目录 一、PROCEDURE1.1 语法1.2 描述1.3 参数1.4 示例 二、FUNCTION2.1 语法2.2 重载2.3 示例2.4 兼容性2.5 示例2.5.1 declare variable 定义变量2.5.2 declare、ARRAY、ANY2.5.2.1 ARRAY 和 ANY 三、其他3.1 PL/pgSQL 在PostgreSQL中&#xff0c;存储过程&#xff08;Pro…

家中R4S软路由iStoreOS配置内网穿透服务实现远程访问公司电脑桌面

文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址 访问公司电脑**具体操作方法是&#xff1a;** 简介 软路由是PC的硬件加上路由系统来实现路由器的功能&#xff0c;也可以说是使用软件达成路由功能的路由器。 使用软路由控制局域网内计算机的好处&#xff1a…

【Jvm】性能调优(上)线上问题排查工具汇总

文章目录 一.互联网概念1.产品闭环和业务闭环2.软件设计中的上游和下游3.JDK运行时常量池 二.CPU相关概念1.查询CPU信息2.CPU利用率&#xff08;CPU utilization&#xff09;和 CPU负载&#xff08;CPU load&#xff09;2.1.如何理解CPU负载2.2.top命令查看CPU负载均值2.3.CPU负…

更改WordPress作者存档链接author和Slug插件Edit Author Slug

WordPress默认所有用户的存档永久链接都是/author/username/&#xff0c;不管是管理员还是订阅者或贡献者或作者或编辑。如果你想要自定义用户存档链接&#xff0c;比如根据角色不同使用不一样的author&#xff0c;或者自定义作者链接中的用户名Slug&#xff0c;那么建议考虑使…

如何使用Docker部署Drupal并结合cpolar实现固定公网地址访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

选择结构switch

一、执行流程 所有case都和表达式的值不匹配&#xff0c;就会执行default语句体部分 从被匹配的位置开始执行&#xff0c;如果遇到break&#xff0c;那么退出选择结构 二、注意事项 1、case后面的【常量值】不能重复&#xff0c;不然编译器会报错 2、switch后面的小括号只…

MoonBit新增functional for loop控制流支持

1. 增加functional for loop控制流支持 与传统的命令式for loop 不同&#xff0c;循环变量是不可变的。这样的设计将来也容易抽取出来做形式化验证&#xff1a; fn init {for i 0; i < 5; i i 1 {debug(i)// i i 4 error: The variable i is not mutable.} }输出&am…

一文概括|CSC访问学者/博士后/联培申请及派出流程详解

为帮助申请者了解国家留学基金委&#xff08;CSC&#xff09;的政策&#xff0c;以及申报及派出的全过程&#xff0c;知识人网小编利用本文简略介绍并提出规划建议。 公派留学包括国家、地方&#xff08;含省市、行业、学校医院等单位&#xff09;资助派出。而国家公派则由留学…

十字星K线(Doji)含义,fpmarkets澳福一分钟讲解

许多新手交易者遇到过这种奇怪的烛台&#xff0c;看起来就像一个十字架&#xff0c;没有主体上下有长长的影子&#xff0c;fpmarkets澳福肯定的告诉各位投资者&#xff0c;这种就是十字星K线(用Doji表示)&#xff0c;开盘价与收盘价一致&#xff0c;价格运动已经停止时出现在烛…

洛谷C++简单题小练习day15—计算阶乘小程序(不用循环)

day15--计算阶乘小程序--2.19 习题概述 题目描述 求 n!&#xff0c;也就是 123⋯n。 挑战&#xff1a;尝试不使用循环语句&#xff08;for、while&#xff09;完成这个任务。 输入格式 第一行输入一个正整数 n。 输出格式 输出一个正整数&#xff0c;表示 n! 代码部分 …

从零开始的 dbt 入门教程 (dbt core 开发进阶篇)

引 在上一篇文章中&#xff0c;我们花了专门的篇幅介绍了 dbt 更多实用的命令&#xff0c;那么我们继续按照之前的约定来聊 dbt 中你可能会遇到的疑惑以及有用的概念&#xff0c;如果你是 dbt 初学者&#xff0c;我相信如下知识点一定会对你有极大的帮助&#xff1a; 了解 db…

简单贪吃蛇模拟(C语言版本·)

简单贪吃蛇模拟&#xff08;C语言版本&#xff09; 一、所需win32 API知识二、游戏逻辑实现 一、所需win32 API知识 1.在这儿&#xff0c;直接弱化概念&#xff0c;把在贪吃蛇中用到的API知识说一下&#xff01;  1.1用cmd命令来设置控制台窗口的长宽   1.2.用title 指令…

python入门----基础

这里写目录标题 重点虚拟环境/与//的区别/// 关于print字符串可以用号拼接单双引号转义符换行三引号 变量变量的定义变量名的命名 API库导库以及使用 注释单行注释多行注释 数据类型strboolNoneTypetype函数 交互模式介绍开启 input作用延伸 if-else条件嵌套语句逻辑运算符内容…

世界顶级名校计算机专业,都在用哪些书当教材?

前言 在当今信息化、数字化时代&#xff0c;计算机科学已成为全球最为热门和重要的学科之一。世界顶级名校的计算机专业&#xff0c;更是培养未来行业领袖和创新人才的重要基地。那么&#xff0c;这些名校的计算机专业究竟使用哪些教材呢&#xff1f;这些教材又具有哪些特色和…

11. Springboot集成Dubbo3(二)示例demo

目录 1、前言 2、注册中心 3、快速开始 3.1、添加dubbo3依赖 3.2、dubbo3-api ​编辑 3.3、dubbo3-server 3.3.1、添加依赖 3.3.2、实现IUserService 3.3.3、添加配置文件application.properties 3.3.4、修改Application启动类 3.3.5、出错解决 3.4、dubbo3-porta…

Golang 更严格的代码格式化工具 gofumpt

一、前言 gofmt 是 golang 自带的代码自动格式化工具&#xff0c;是保证 Go 代码风格一致的大杀器。我们这次要推荐的 gofumpt 在 gofmt 的基础上添加了一系列更加严格的格式化规则&#xff0c;并保证了对 gofmt 的兼容。 二、gofumpt 简介 gofumpt(https://github.com/mvda…

职业性格在求职应聘和跳槽中的作用

性格测试对跳槽者的影响大不大&#xff1f;首先我们要弄清楚两个问题&#xff0c;性格对我们的职业生涯又没有影响&#xff0c;性格测试是什么&#xff0c;职场中有哪些应用&#xff1f;性格可以说从生下来就有了&#xff0c;随着我们的成长&#xff0c;我们的性格也越来越根深…

2024开工大吉,便宜寄快递该怎么选呢?

随着春节的结束&#xff0c;大部分人回到了工作的岗位&#xff0c;相信许多人还沉浸在过年的喜悦的氛围中呢&#xff0c;但是我们可以期盼下一个春节的到来了&#xff0c;言归正传&#xff0c;工作中总会收发快递了&#xff0c;尤其是最近&#xff0c;需要联络客户的感情了&…

串口通信功能介绍和配置

用户GPIO中其实很多IO口可以复用成串口功能&#xff08;可查看复用定义表&#xff09;&#xff0c;但是我们这里按照默认定义所以只对8脚、9脚进行复用测试&#xff0c;引脚定义入下图&#xff1a; 硬件连接 测试串口我们需要一个串口调试工具&#xff0c;可以使用串口烧录工具…
最新文章