22. 正则表达式

news/2024/10/24 18:22:47/文章来源:https://www.cnblogs.com/FlurryHeart/p/18500184

一、概述

  正则表达式(regular expression)又称 规则表达式,是一种文本模式(pattern)。正则表达式使用一个字符串来描述、匹配具有相同规格的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式的核心功能就是处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。

二、re模块

  在 Python 中提供了 re 模块来使用正则表达式。每一个字符串都可以视为一个简单的正则表达式。

re.findall(pattern, string, flags=0)            # 去整个文本中查找所有符合正则表达式的文本
re.search(pattern, string, flags=0)             # 去整个文本中去匹配,返回匹配成功的第一个
re.match(pattern, string, flags=0)              # 从开始位置开始匹配,返回匹配成功的第一个
re.split(pattern, string, maxsplit=0, flags=0)  # 根据正则表达式切割字符串
re.Match.group([group1, ...])                   # 返回这个匹配对象或者特定子组
re.Match.groups(default=None)                   # 返回一个唯一或者全部子组的元组

  在 Python 中,主要有两种方法完成模式匹配:“搜索”(searching),即在字符串任意部分中搜索匹配的模式;而 “匹配”(matching)是指判断一个字符串能否从起始处全部或者部分匹配某个模式。搜索通过 search() 函数或方法来实现,而匹配是调用 match() 函数或方法实现。

  match() 函数试图从字符串的起始部分对模式进行匹配。如果匹配成功,就返回一个匹配对象(Match 对象);如果匹配失败,就返回 None,匹配对象(Match 对象)的 group() 方法能够用于显示那个成功的匹配。

  search() 的工作方式与 match() 完全一致,不同之处在于 search() 会用它的字符串参数,在任意位置对给定正则表达式模式搜索第一次出现的匹配情况。如果搜索到成功的匹配,就会返回一个匹配对象(Match 对象);否则,返回 None。

  由此可见,match() 试图从字符串的起始部分开始匹配模式,而 search() 函数不但会搜索模式在字符串中第一次出现的位置,而且严格地对字符串从左到右搜索。

  findall() 查询字符串中某个正则表达式模式全部的非重复出现情况。这与 search() 在执行字符串搜索时类似,但与 match() 和 search() 的不同之处在于,findall() 总是返回一个列表。如果 findall() 没有找到匹配的部分,就返回一个空列表,但如果匹配成功,列表将包含所有成功的匹配部分(从左到有按出现顺序排列)。

import recontent = "你好啊,小樱同学!欢迎你加入小樱班。从现在开始你就是我的朋友啊。小樱同志,请多多关照。"
regex = "小樱"result = re.findall(regex,content)
print(result)result = re.search(regex,content)
print(result.group())result = re.match(regex,content)
print(result)result = re.split(r"[,!。]",content)
print(result)

三、基础语法

3.1、转义字符

  使用正则表达式去检索某些特殊字符的时候,需要用到转义字符,否则检索不到结果,甚至会报错;在 Python 中,\ 具有转义的意思,会对紧随其后的字符进行转义,如果我们想使用普通的 \ ,需要在使用一个 \ 对它进行转义。

import recontent = "abc$def(123(456))"
regex = "\(456"result = re.findall(regex,content)
print(result)result = re.match(regex,content)
print(result)

需要用到转义符号的常见字符如下:. * + ( ) $ / \ ? [ ] ^

3.2、字符匹配符

字符匹配符 含义 实例 解释
[] 可接收的字符列表 [abc] a、b、c 中的任意 1 个字符
[^] 不可接收的字符列表 [^abc] 除 a、b、c 之外的任意 1 个字符
包括数字和特殊符号
- 连字符 a-z 任意一个小写字母
import recontent = "abc123def4567AbC"result = re.findall("[abc]",content)
print(result)result = re.findall("[^abc]",content)
print(result)result = re.findall("[a-z]",content)
print(result)

3.3、元字符

元字符 含义
. 匹配单个除换行符以外的任意字符
\d 匹配 0~9 任意一个数字
\D 匹配单个任意非数字字符
\s 匹配任意空白字符
\S 匹配任意不是空白符的字符
\w 匹配字母或数字或下划线的任意字符
\W 匹配任意不是字母、数字、下划线的字符
import recontent = "abc123def4567AbC"result = re.findall("\\d\\d\\d",content)
print(result)result = re.findall(r"\d\w",content)
print(result)

元字符的大写表示不匹配;

3.4、重复限定符

  重复限定符用于指定其前面的字符和组合项连续出现多少次。

重复限定符 意义
? 0 次 或 1 次
* 0 次 或 多次
+ 1 次 或 多次
{n} 正好出现 n 次
{n,} 至少出现 n 次
{n,m} 出现 n 次 至 m 次
import recontent = "abc123def4567AbC89d115200a1"resutl = re.findall(r"\d{3,5}",content)
print(resutl)result = re.findall(r"\d+",content)
print(result)

3.5、定位符

  定位符,用来指定要匹配的字符串出现的位置。

定位符 含义
^ 指定起始字符
` 定位符
------ ----------------------------------------------------------------------------
^ 指定起始字符
指定结束字符
\b 匹配目标字符串的边界,
边界指的是字串间有空格,或者目标字符串的结束位置
\B 匹配非单词边界
import recontent = "abc123 def4567abc123abc abc89 d115200 a1abc"result = re.findall("^abc",content)
print(result)result = re.findall("abc$",content)
print(result)result = re.findall(r"abc\b",content)
print(result)result = re.findall("^ab\B",content)
print(result)

3.6、选择匹配符

  正则表达式用符号 | 来表示或,也叫做分支条件,当满足正则表达里的分支条件的任何一种条件时,都会当成匹配成功。

import recontent = "你好啊,小樱同学,欢迎你加入小樱班,从现在开始你就是我的朋友啊,小樱同志,请多多关照。"
regex = "小樱同学|小樱同志"result = re.findall(regex,content)
print(result)

3.6、分组组合

  重复限定符是作用在与它相邻的最左边的一个字符。正则表达式中可以使用小括号 () 来做分组,也就是括号中的内容会作为一个整体。

3.6.1、捕获分组

  我们可以使用 group() 方法匹配对象方法,从一个分组中获取匹配的文本。正则表达式字符串中的第一对括号是第 1 组,第二对括号是第 2 组,依次类推。向 group() 匹配对象方法传入整数就可以取得匹配文本的不同部分。向 group() 传入 0 或者不传入参数,将返回这个匹配的文本。

  如果想要一次就获取所有的分组,我们可以使用 groups() 方法。

捕获分组 说明
(pattern) 非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其它捕获结果则根据左括号的顺序从 1 开始自动编号。
(P<name>pattern) 命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于 name 的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号。
import recontent = "我是小樱,我的身份证明是37028419860401232X"
regex = r"\d{6}(\d{4})(\d{2})(\d{2})\d{3}[\dX]"result = re.search(regex,content)
year = result.group(1)
month = result.group(2)
day = result.group(3)print(result.group(0))
print(f"{year}-{month}-{day}")
import recontent = "我是小樱,我的身份证明是37028419860401232X"
regex = r"\d{6}(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2})\d{3}[\d|X]"result = re.search(regex,content)
year = result.group("year")
month = result.group("month")
day = result.group("day")print(result.group(0))
print(f"{year}-{month}-{day}")

3.6.2、非捕获分组

非捕获分组 说明
(?:pattern) 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储以后使用的匹配。
例如:"小樱(?:同学|同志)" 等价于 "小樱同学|小樱同志"
(?=pattern) 它是一个非捕获匹配。
例如:"Harmony(?=2|3)" 匹配 "Harmony2" 中的 "Harmony",但不匹配 "Harmony1" 中的 "Harmony"
(?!pattern) 该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配。
例如:"Harmony(?=2|3)" 匹配 "Harmony1" 中的 "Harmony",但不匹配 "Harmony2" 中的 "Harmony"
import recontent = "你好啊,小樱同学,欢迎你加入小樱班,从现在开始你就是我的朋友啊,小樱同志,请多多关照。"regex = "小樱(?:同学|同志)"
result = re.findall(regex,content)
print(result)regex = "小樱(?=同学|同志)"
result = re.findall(regex,content)
print(result)regex = "小樱(?!同学|同志)"
result = re.findall(regex,content)
print(result)

3.7、非贪婪匹配

  当 ? 元字符紧随任何其它限定符 (*、+、?、{n}、{n,}、{n,m})之后,匹配模式是 “非贪婪匹配”。非贪婪匹配搜索到、尽可能短的字符串。而默认的贪婪匹配搜索到的尽可能长的字符串。

import recontent = "abc111111abc"# 贪婪匹配
result = re.findall(r"\d{3,5}",content)
print(result)# 非贪婪匹配
result = re.findall(r"\d{3,5}?",content)
print(result)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZetCode-GUI-教程-九-

ZetCode GUI 教程(九)原文:ZetCode 协议:CC BY-NC-SA 4.0wxWidgets 中的布局管理原文: http://zetcode.com/gui/wxwidgets/layoutmanagement/典型的应用由各种小部件组成。 这些小部件放置在容器小部件内。 程序员必须管理应用的布局。 这不是一件容易的事。 在 wxWidgets…

ZetCode-PHP-教程-一-

ZetCode PHP 教程(一)原文:ZetCode 协议:CC BY-NC-SA 4.0PHP 教程原文: https://zetcode.com/lang/php/这是 PHP 教程。 本教程涵盖了 PHP 编程语言的核心。 它使用 PHP CLI。 PHP 教程适合初学者。 目录PHP 语言 词法结构 基础知识 数据类型 字符串 运算符 控制流 数组 数…

BeginnersBook-C-语言示例-一-

BeginnersBook C 语言示例(一)原文:BeginnersBook 协议:CC BY-NC-SA 4.0C 程序:检查阿姆斯特朗数原文: https://beginnersbook.com/2014/06/c-program-to-check-armstrong-number/如果数字的各位的立方和等于数字本身,则将数字称为阿姆斯特朗数。在下面的 C 程序中,我们…

BeginnersBook-C---教程-一-

BeginnersBook C++ 教程(一)原文:BeginnersBook 协议:CC BY-NC-SA 4.0C++ 中的for循环原文: https://beginnersbook.com/2017/08/cpp-for-loop/循环用于重复执行语句块,直到满足特定条件。例如,当您显示从 1 到 100 的数字时,您可能希望将变量的值设置为 1 并将其显示 …

BeginnersBook-Servlet-教程-一-

BeginnersBook Servlet 教程(一)原文:BeginnersBook 协议:CC BY-NC-SA 4.0项目的web.xml文件中的welcome-file-list标签原文: https://beginnersbook.com/2014/04/welcome-file-list-in-web-xml/你有没见过web.xml文件中的<welcome-file-list>标签并想知道它是什么?…

.net7.0 WebApi 添加 JWT 验证

https://blog.csdn.net/u012563853/article/details/128659472 详细步骤: 1.创建默认WebApi 项目2.开始添加认证包 安装 Microsoft.AspNetCore.Authentication.JwtBearer 包 这个包是用来支持WebApi 的 JWT 认证的3.在appsetting 中配置JWT的配置信息 这里需要注意的是 key …

2024-10-24 瀑布流(vue3)

效果图: 代码:<template><div id="waterfallContainer" class="waterfall-container"><div v-for="(column, columnIndex) in columns" :key="columnIndex" class="waterfall-column"><div v-for=&q…

如何用反射调用泛型类的方法

例子一:泛型类不含构造函数using System; using System.Reflection;namespace 使用反射调用泛型类的方法 {class Program{static void Main(string[] args){//定义要使用的类型参数(就是调用方法时要传入的参数类型,例如int)Type genericTypeArgument = typeof(int);//获取…

[日志分析篇]-利用ELK分析jumpserver日志-日志拆分篇

需要通过elk日志分析平台接收jumpserver日志,对日志进行过滤和拆分。并通过Grafana进行企业微信告警推送和大屏展示1.系统介绍名称 软件版本jumpserver jumpserver-3.10.13-tlselasticsearch elasticsearch-8.12.2kibana kibana-8.12.2logstash logstash-8.12.2granfa Grafana…

IDEA运行不了代码

同样的代码在eclipse可以正常运行,创建的方法也保持一样,为什么在IDEA就报错,本人是小白看不懂下面的报错

扩展被恢复分区挡住的 C 盘

之前装系统的时候想着以后要不要装个 Ubuntu 以作备用,所以给 SSD 分区的时候留了一小部分,没有全分给 C 盘。结果后来用 WSL 用得乐不思蜀了,觉得剩下的空间留着没必要,于是想把剩下的空间扩容给 C 盘。结果操作的时候发现 C 盘后面跟了一个恢复分区!无法给 C 盘扩容了。…

若依开启注册功能

若依开启用户注册功能 1、修改数据库,如下:2、修改前端:参考鸣谢: https://blog.csdn.net/weixin_43684214/article/details/121609310