Python之正则表达式细讲

news2025/7/27 12:35:42

文章目录

  • 前言
  • 一、行定位符
  • 二、元字符
  • 三、限定符
  • 四、字符类
  • 五、排除字符
  • 六、选择字符
  • 七、转义字符
  • 八、分组
  • 九、正则表达式语法
  • 总结


前言

  在处理字符串时,经常会有查找符合某些复杂规则的字符串的需求。比如用爬虫批量抓取某网站图片,要从抓下来的网页信息中提取出所有的图片地址如下图所示:
在这里插入图片描述

  这时候正则表达式就派上了用场,正则表达式就是记录文本规则的代码,有了它,我们可以从海量数据里面精准筛选出需要的那部分内容。今天就详细来看看正则表达式中的特殊字符以及详细用法。


一、行定位符

  行定位符就是用来描述字符串的边界,“^” 表示行的开始,“$” 表示行的结尾。比如:

^Ha

  该表达式表示要匹配字符串的开头位置是 Ha,如 “Hangzhou is a very beautiful city” 可以匹配,而 “Your words are very funny, Ha” 则不匹配。但如果使用:

Ha$

  后者可以匹配而前者不能匹配。如果要匹配的字符串可以出现在字符串的任意部分,那么可以写成下面的格式,这样两个字符串都能匹配上。

Ha

二、元字符

  除了前面介绍的 “^” 和 “$” 外,正则表达式里还有更多的元字符,例如下面的正则表达式中就应用了元字符 “\b” 和 “\w”。

\ban\w*\b

  上面的正则表达式用于匹配以字母 an 开头的字符串,先从字符串的开头 an 处开始匹配,接着是任意数量的字母或数字(\w*)。该表达式可以匹配 “anaconda” 和 “and246”,但不能与 “abandon” 匹配。更多常见元字符如下表所示:

元字符说明举例
.匹配除换行符以外的任意字符. 可以匹配 “acd\n8R\t” 中的 a、c、d、8、R、\t
\w匹配字母、数字、下划线或汉字\w 可以匹配 “miO次9\nqw” 中的 “m、i、O、次、9、q、w”,但不能匹配 \n
\W匹配除字母、数字、下划线或汉字以外的字符\W 可以匹配 “92d\nsc” 中的 \n,但不能匹配 “9、2、d、s、c”
\s匹配单个的空白符(包括 Tab 键和换行符)\s 可以匹配 “c\t8B” 中的 \t
\S匹配除单个空白符(包括 Tab 键和换行符)以外的所有字符\S 可以匹配 “字we2\t90” 中的 “字、w、e、2、9、0”
\b匹配单词的开始或结束,单词的分解符通常是空格,标点符号或者换行在 “there were deserts where” 字符串中,\bw 与 were 中的 w 相匹配,但与 where 中的 w 不匹配
\d匹配数字\d 可以与 “dg34&” 中的 3、4 匹配

三、限定符

  在上面例子中,使用(\w*)可以匹配任意数量的字母或数字。但如果想要匹配指定数量的数字,该如何表示呢?
在这里插入图片描述
  正则表达式为我们提供了限定符(指定数量的字符) 来实现该功能。如匹配 11 位电话号码可使用如下表达式:

^\d{11}$

  常用的限定符如下表所示:

限定符说明举例
?匹配前面的字符 0 次或 1 次Pyth?on,该表达式可以匹配 Python 和 Pyton
+匹配前面的字符 1 次或多次Py+thon,该表达式可以匹配的范围从 Python 到 Pyy…thon
*匹配前面的字符 0 次或多次Pyt*hon,该表达式可以匹配的范围从 Pyhon 到 Pytt…hon
{n}匹配前面的字符 n 次Pytho{3}n,该表达式只匹配 Pythooon
{n,}匹配前面的字符至少 n 次Pytho{3,}n,该表达式可以匹配的范围从 Pythooon 到 Pythooo…n
{n,m}匹配前面的字符最少 n 次,最多 m 次P{1,3}ython,该表达式可以匹配 Python、PPython、PPPython

四、字符类

  正则表达式查找数字和字母是很简单的,因为已经有了对应这些字符集合的元字符(如 “\d”、“\w”),但是如果要匹配没有预定义元字符的字符集合(比如只匹配元音字母a,e,i,o,u),应该怎么办?
  很简单,只需要在方括号里列出它们就行了,像 [aeiou] 可以匹配任何一个英文元音字母,[.?!] 匹配标点符号(“.”,“?”,“!”),也可以轻松的指定一个范围,像 “[0-9]” 代表的含义与 “\d” 就是完全一致的:代表一位数字。同理,“[a-z0-9A-Z_]” 完全等同于 “\w”(如果只考虑英文的话)。

五、排除字符

  在上面的字符类中列出的匹配符合指定字符集合的字符串。现在反过来,匹配不符合指定字符集合的字符串。正则表达式提供了 “^” 字符。这个元字符在上面出现过,表示行的开始。而这里将会放到方括号中,表示排除的意思。例如:

[^a-zA-Z]

  该表达式用于匹配一个不是字母的字符。

六、选择字符

  试想一下,如何匹配身份证号码?首先需要了解一下身份证号码的规则。身份证号码长度为 18 位,前 17 位为数字,最后一位是校验位,可能为数字或字符 X。
  在上面的描述中,包含着条件选择的逻辑,这就需要使用选择字符|)来实现。该字符可以理解为 “”,匹配身份证的表达式可以写成如下方式:

(^\d{18}$)|(^\d{17})(\d|X|x)$

  该表达式的意思是匹配 18 位数字,或者 17 位数字和最后一位。最后一位可以是数字,也可以是 X 或者 x。

七、转义字符

  正则表达式中的转义字符(\)和 Python 中的大同小异,可以将字符本身的含义转成特定的含义,如果是特殊字符(比如 “.” “?” “\” 等)则转变为普通的字符。举一个 IP 地址的实例,用正则表达式匹配诸如 “127.0.0.1” 格式的 IP 地址。如果直接使用点字符,格式为:

[1-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}

  这显然不对,因为 “.” 可以匹配一个任意字符。这时,不仅是127.0.0.1 这样的 IP,连 127a0b0c1 这样的字符串也会被匹配出来。所以在使用 “.” 时,需要使用转义字符(\)。修改后上面的正则表达式格式为:

[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

🌱 说明括号在正则表达式中也算是一个元字符。

八、分组

  通过上面的选择字符板块,大家对小括号的作用有了一定了解。小括号字符的第一个作用就是可以改变限定符的作用范围,如 “|” “*” “^” 等。例如下面的表达式中包含小括号。

(fruit|food)s

  这个表达式的意思是匹配单词 fruits 或 foods,如果不使用小括号,那么就变成了匹配单词 fruit 和 foods 了。
  小括号的第二个作用是分组,也就是子表达式。如 ([a-z]{1,3}){3},就是对分组 ([a-z]{1,3}) 进行重复操作。

九、正则表达式语法

  在Python中使用正则表达式时,是将其作为模式字符串使用的。例如,将匹配不是字母的一个字符的正则表达式表示为模式字符串,可以使用下面的代码:

'[^a-zA-Z]'

  而如果将匹配以字母 g 开头的单词的正则表达式转换为模式字符串,则不能直接在其两侧添加引号定界符,例如,下面的代码是不正确的。

'\bg\w*\b'

  而是需要将其中的 “\” 进行转义,转换后的结果为:

'\\bg\\w*\\b'

  由于模式字符串中可能包括大量的特殊字符和反斜杠,所以需要写为原生字符串,即在模式字符串前加 r 或 R。例如,上面的模式字符串采用原生字符串表示为:

r'\bg\w*\b'

🌱 说明在编写模式字符串时,并不是所有的反斜杠都需要进行转换,没有特殊意义的就不用转。


总结

  今天主要介绍了正则表达式的全部特殊字符和语法,里面牵涉的字符种类居多,建议大家不要强行记忆。在下一篇博客中会讲到Python中怎么实现正则表达式操作,学了之后就可以结合这篇博客中的众多字符用法进行实操。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI写作】 机器人流程自动化 介绍 - Robotic Process Automation (RPA) Introduction

写一篇文章介绍RPA技术,未来的发展。使用markdown格式,有3级索引,超过3000字。 某位大师说过的: 任何行业、任何部门都有大量的场景,涉及重复、有规则逻辑的工作,都可以用 RPA 开发一个软件机器人帮助完成。 文章目录 机器人过程自动化(RPA)简介RPA的定义RPA的好处Robo…

国内“谁”能实现chatgpt,短期穷出的类ChatGPT简评(算法侧角度为主),以及对MOSS、ChatYuan给出简评,一文带你深入了解宏观技术路线。

1.ChatGPT简介【核心技术、技术局限】 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序 ,于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c…

这周末,StarRocks 邀请开发者们一起来上海 GAIDC 开源集市,各种任务等你来挑战!

2 月 25 日-26 日 (本周末)2023 全球人工智能开发者先锋大会(GAIDC)将于上海临港中心举行!StarRocks 社区受邀参与开源集市,展示开源魅力、分享社区成果。欢迎上海的同学们到“摊位”上与工作人员互动&…

经典设计模式MVC理解

MVC是模型(Model)、视图(View)、控制器(Controller)的简写,将业务逻辑、数据、显示分离的方法来组织代码。今天简单回顾一下。 mvc释义理解 M代表模型(Model),表示业务规则封装。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据…

Kibana与Elasticsearch

下载与安装Kibanahttps://www.elastic.co/cn/downloads/kibanaKibana的版本与Elasticsearch的版本是一致的,使用方法也和Elasticsearch一致。由于我的英文不是特别好,我们找到config/kibana.yml末尾添加i18n.locale: "zh-CN" ,汉化…

15 款面向内容创作者的 AI 工具

获得 AI 帮助,让您的营销流程更高效、超越竞争对手并扩大您的受众 🤖作为内容创作者,您知道引人入胜且有趣的内容是吸引观众注意力的关键。但是,如果有工具可以帮助您比以往更快、更轻松地创建更具吸引力的内容呢?这就…

自动驾驶仿真:ECU TEST自动化测试常用API调用

文章目录一、 API调用运行环境二、ET API帮助文档三、如何导入ET API四、 ET常用接口1、 创建用于添加测试步骤的Package2、 在Package的TestStep中添加precondition块3、 在Package的TestStep中添加Block块4、在Package的TestStep中添加PostconditionBlock块5、 在Package的Te…

JAVA 8 新特性 Lamdba表达式

Java8 新特性: 1、Lamdba表达式 2、函数式接口 3、方法引用和构造引用 4、Stream API 5、接口中的默认方法和静态方法 6、新时间日期API 7、Optional 8、其他特性 Java8 优势:速度快、代码更少(增加了新的语法 Lambda 表达式)、强…

Centos安装Python、PyCharm

安装Python 1、打开终端(Terminal) 2、输入以下命令更新系统: sudo yum update 3、安装Python: sudo yum install python3 4、安装完成后,可以使用以下命令检查Python版本: python3 --version 安装PyCharm 1、下载PyCharm的安…

SQL server设置用户只能访问特定数据库、访问特定表或视图

在实际业务场景我们可能需要开放单独用户给第三方使用,并且不想让第三方看到与业务不相关的表或视图,我们需要在数据库中设置一切权限来实现此功能: 1.设置用户只能查看数据库中特定的视图或表 1.创建用户名 选择默认数据库 服务器角色默认…

什么是项目管理?项目经理应该如何进行管理?

项目管理: 一是指一种管理活动,一种有意识地按照项目的特点和规律,对项目进行组织管理的活动; 二是指一种管理学科,以项目管理活动为研究对象的一门学科,它是探求项目活动科学组织管理的理论与方法。 就…

90%的程序员还不知道ChatGPT能这么用

本内容来自公众号“布博士”------(擎创科技资深产品专家)当下,越来越多的企业已经开始应用机器学习和自然语言处理等技术来辅助告警故障分析。在这个领域中,CHATGPT这样的人工智能模型可以扮演非常重要的角色,通过对历…

压榨配置写出颠覆认知的Java线程池

Java线程池参数调优前言线程池常见误解■ 必须用线程池 不能直接new线程■ 7参数的生效顺序结论Java线程池参数调优■ 网上流传的线程数计算公式■ 调整生产消费平衡疑问① 能否直接设置大量线程数疑问② 这个核心数最好吗■ 经典案例-业务请求第三方接口■ 反思过去配置的线程…

CSS 基础【快速掌握知识点】

目录 一、什么是CSS 二、CSS发展史 三、CSS基本语法结构 1、语法 2、例如 四、style标签 五、HTML中引入CSS样式 1、行内样式 2、内部样式表 3、外部样式表 六、CSS基本选择器 1、标签选择器 2、类选择器 3、ID选择器 4、总结 5、基本选择器的优先级 七、CSS的…

通过自适应 MFA 提高 IT 安全性

什么是多重身份验证 (MFA) 多重身份验证 (MFA)为登录流程增加了一层保护。访问帐户或应用时,用户需要提供额外的身份验证,例如扫描指纹或输入手机收到的代码。 为什么自适应的身份验证重要 鉴于当今不断变化的 IT 威胁形势,多重身份验证 &…

此 Google 帐号尚未与设备关联。要安装应用,请先访问设备上的 Play 商店应用。 了解详情(已解决)

当你在谷歌Play商店想要下载一些手机应用时,经常会有跳提示: 此 Google 帐号尚未与设备关联。要安装应用,请先访问设备上的 Play 商店应用。 了解详情 此时需要打开你的Chrome浏览器,打开设置-扩展程序-打开Chrome应用商店 或直接…

SpringBoot中使用spring-retry解决重试

使用场景 在日常开发过程中,难免会与第三方接口发生交互,例如:短信发送、远程服务调用、争抢锁等场景,当正常调用发生异常时,例如:网络抖动,这些间歇性的异常在一段时候之后会自行恢复&#xf…

【华为OD机试模拟题】用 C++ 实现 - 开心消消乐(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

支付系统中的设计模式09:组合模式

现在就剩下怎么能够实现运营部提出的「打印出平台顾客购买的商品小票」这个需求了。 我们去超市买完东西之后,都会收到收银员打印出来的小票,就是商品清单、价格、数量和汇总的信息。下面这个我想应该99%的人都见过吧。 图三十七:超市购物小票 线上也是一样,也会有这种购物…

【软件测试】测试人不躺平,进军高级自动化测试自救,你的不一样结局......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 随着测试从业年龄的…