网络分析法 (2)-- >>正则表达式(1)概念,匹配字符集,零宽断言

本文介绍了正则表达式的基本概念,应用场景,如表单验证和爬虫数据提取。详细讨论了字符集、数字相关字符集的匹配,以及正则表达式的常用方法,包括数量限定、分支匹配和分组。重点讲解了零宽断言的四种形式,包括先行断言、后发断言及其否定形式,解释了它们在匹配过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

正则表达式并不是python独有的,它就是一种表达式,适用于多种语言,但是我们目前博客以学python爬虫,所以从python爬虫角度分析及使用

概念

  • 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。

    • 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

      • 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址(123456789@qq.com),虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用。
  • 正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。

  • 正则表达式是对字符串操作的⼀种逻辑公式,就是⽤事先定义好的⼀些特定字 符、及这些特定字符的组合,组成⼀个“规则字符串”,这个“规则字符 串”⽤来表达对字符串的⼀种过滤逻辑

正则表达式的应⽤场景

  • 表单验证(例如 : ⼿机号、邮箱、身份证… )
  • 爬⾍

提取指定字符

获取数据结合,有用的数据只有一部分,我们可以指定字符串进行匹配

语法含义表达式匹配的字符串
一般字符串匹配自身abcabc
.可以匹配除了换行符“\n”之外的任意字符a.cabc、aec、a#c、a9c
[]匹配括号中的任意字符a[1b$]ca1c、abc、a$c
[^]"^"在中括号内,表示取反,即匹配出了中括号内的数据a[^123]cabc、a4c
\转义字符,使最后一个字符改变原来的意思,如“\”中的"."代表本身,而不是任意字符a[db.\]cadc、abc、a.c、a\c

预定义字符集

语法含义表达式匹配的字符串
^匹配字符串的开始^abcabcde
$匹配字符串的结尾abc$123abc
\b匹配单词的开始或结束\babc\babc
\d匹配数字0~9a\dca3c
\D匹配非数字,相当于[^\d]a\Dca@c
\s匹配任意空白字符,等价于[<空格>\tnlr\f].alscac
\S匹配任意非空白字符,等价于[^\s]a\ScaDc、a*c
\w匹配单词字符[A-Za-20-9_ ],字母、数字、下划线a\wcabc、alc、aBc、a_c
\W匹配非单词字符,等价于[^\w]a\Wca%C、ac、a-C

匹配数字相关的字符集

在这里插入图片描述

特殊场景使用匹配字符集

在这里插入图片描述

正则表达式常用方法

在这里插入图片描述

数量限定

语法含义表达式匹配的字符串
*匹配前一个字符0次或多次abc*ab、abccc
+匹配前一个字符1次或多次abc+abc、abccc
?匹配前一个字符0次或1次abc?ab、abc
{m}匹配前一个字符m次a{2}bcaabc
{m,}匹配前一个字符m次或更多次a{2,}bcaabc、aaaabc
{,m}匹配前一一个字符0-m次a{,2}bcbc、abc、aabc
{m,n}匹配前一个字符m至n次a{1,3}bcabc、aabc、 aaabc

分支匹配

如果有多种匹配规则,则满足任意一种规则即可完成匹配,这时就要用到分支条件的匹配。比如日体格式,20810-10 20181010 或者2018 10.10都满足条件,从左往右,匹配到任意一个即可

语法含义表达式匹配的字符串
|左右两个表达式满足一一个即可, 先左后右,一旦左边匹配成功,则跳过右边匹配\d{4}-ld{2}-\d{2}|\d{4}^d{2}^\d{2}|\d{4}\.\d{2}\.\d{2}2018-12-12

分组

上表中的正则表达式不仅能匹配到2018- 12-12这样的日期,也能匹配到2018-99-99这样不存在的日期,需要对月份日期做具体的限定,月份应该是0[1-9]1[0-2], 日应该是0[-9][12][0-9]3[01],完整表达式为\d{4}-(O[1-9]|1[0-2])-(O0[1-9][12][0-9]3[01])。这里没有判断每月是否有31日,二月是否为闰月,更详细的判断请读者练习完成。

每个“0”为一个分组,分组的起始编号为1,每遇到一一个“(”编号加1,在提取数据时,可以方便地将-组数据单独提取出来。

零宽断言

先介绍什么是零宽断言,在程序设计中,断言指的是判断一个情况是否为真,而在正则表达式中,零宽断言指的是当断言表达式为真的时候,再进行匹配,匹配的时候并不匹配断言表达式的内容。断言有不同的形式,结合如下字符串更好理解:

Rita repeatedwhat Reardonrecited when

(1)先行断言,也叫作零宽度正预测先行断言,表达式: (?=exp); 当断言表达式为真时,匹配断言表达式前面的位置。先行断言的执行步骤为:先从要匹配的字符串中的最右端找到第一个断言表达式,再匹配其前面的表达式;若无法匹配,则继续查找第二个断言表达式,再匹配第二个断言表达式前面的字符串;若能匹配,则匹配。例如\w+(?=ted),会匹配到repea和reci (断言表达是“ted”不会匹配),而.*(?=t)则 会匹配到My WeChat account。

(2)后发断言,也叫作零宽度正回顾后发断言,表达式: (?<=exp), 当断言表达式为真时,匹配断言表达式后面的位置。与先行断言执行顺序相反,先从要匹配的字符串中的最左端找到第1个断言表达式,再匹配其后面的表达式;若无法匹配,则继续查找第2个断言表达式,再匹配第2个断言表达式后面的字符串;若能匹配,则匹配。例如(?<=re)w+, 会匹配到peated和cited,而(?<=re).*则会匹配到peated what Reardon recited when。

(3)零宽度负预测先行断言,表达式(?!exp), 当断言表达式不成立时,匹配断言表达式前面的位置:若断言表达式成立,则不匹配。例如\b(?!R)w+匹配不以大写字母R开头的字符串。(4)零宽度负回顾后发断言,表达式(?<!exp),当断言表达式不成立时,匹配断言表达式后面的位置:若断言表达式成立,则不匹配。例如w+(?<!ed)b匹配不以ted结尾的字符串。

贪婪模式与非贪婪模式

正则表达式默认是贪婪模式,也就是尽可能多地匹配字符串,比如使用a\w+b匹配a123b123b时,得到的是a123b123b,而不是a123b。想匹配到a123b的时候,就需要启用非贪婪模式,将表达式改为a\w+?b就可以匹配到a123b。数量限定中启用非贪婪模式

语法含义
*?匹配前一个字符0次或多次,尽可能少重复
+?匹配前一个字符1次或多次,尽可能少重复
??匹配前一个字符0次或1次,尽可能少重复
{m,}?匹配前一个字符m次或更多次,尽可能少重复
{m,n}?匹配前一个字符m至n次,尽可能少重复
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值