首页 > 其他分享 >17. 正则表达式

17. 正则表达式

时间:2023-08-16 20:24:58浏览次数:39  
标签:匹配 17 正则表达式 content re result print findall

一、概述

  正则表达式(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)  # 根据正则表达式切割字符串

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

import re

content = "你好啊,小樱同学!欢迎你加入小樱班。从现在开始你就是我的朋友啊。小樱同志,请多多关照。"
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 re

content = "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 re

content = "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 re

content = "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 次 至 m 次
import re

content = "abc123def4567AbC89d115200a1"

resutl = re.findall(r"\d{3,5}",content)
print(resutl)

result = re.findall(r"\d+",content)
print(result)

3.5、定位符

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

定位符 含义
^ 指定起始字符
$ 指定结束字符
\b 匹配目标字符串的边界,
边界指的是字串间有空格,或者目标字符串的结束位置
\B 匹配非单词边界
import re

content = "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 re

content = "你好啊,小樱同学,欢迎你加入小樱班,从现在开始你就是我的朋友啊,小樱同志,请多多关照。"
regex = "小樱同学|小樱同志"

result = re.findall(regex,content)
print(result)

3.6、分组组合

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

3.4.1、捕获分组

捕获分组 说明
(pattern) 非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其它捕获结果则根据左括号的顺序从 1 开始自动编号。
(P<name> pattern) 命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于 name 的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号。
import re

content = "我是小樱,我的身份证明是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 re

content = "我是小樱,我的身份证明是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.4.2、非捕获分组

非捕获分组 说明
(?:pattern) 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储以后使用的匹配。
例如:"小樱(?:同学|同志)" 等价于 "小樱同学|小樱同志"
(?=pattern) 它是一个非捕获匹配。
例如:"Harmony(?=2|3)" 匹配 "Harmony2" 中的 "Harmony",但不匹配 "Harmony1" 中的 "Harmony"
(?!pattern) 该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配。
例如:"Harmony(?=2|3)" 匹配 "Harmony1" 中的 "Harmony",但不匹配 "Harmony2" 中的 "Harmony"
import re

content = "你好啊,小樱同学,欢迎你加入小樱班,从现在开始你就是我的朋友啊,小樱同志,请多多关照。"

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 re

content = "abc111111abc"

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

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

标签:匹配,17,正则表达式,content,re,result,print,findall
From: https://www.cnblogs.com/kurome/p/17636080.html

相关文章

  • P3017 [USACO11MAR] Brownie Slicing G
    P3017[USACO11MAR]BrownieSlicingG[P3017USACO11MAR]BrownieSlicingG-洛谷|计算机科学教育新生态(luogu.com.cn)目录P3017[USACO11MAR]BrownieSlicingG题面翻译题目描述输入格式输出格式样例#1样例输入#1样例输出#1思路code题面翻译Bessie烘焙了一块巧克......
  • 文件解压 //problem/2928 or /contest/1709/problem/3
    字符串套递归#include<bits/stdc++.h>usingnamespacestd;chars[1005];intn,i;stringwork(){stringp;intt=0;while(++i<=n){if(s[i]>='0'&&s[i]<='9'){t=s[i]-'0......
  • Delphi正则表达式初学入门
    一前言 对于正则表达式,相信很多人都知道,但是很多人的第一感觉就是难学,因为看第一眼时,觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完全不知所云。 其实只是对正则不了解而以,了解了你就会发现,原来就这样啊正则所用的相关字符其实不多,也不难记,更不难懂,唯一难的就......
  • ITK 实例17 阈值水平集算法对脑部MHA文件进行三维分割
    1#include"itkImage.h"2#include"itkThresholdSegmentationLevelSetImageFilter.h"34#include"itkFastMarchingImageFilter.h"5#include"itkBinaryThresholdImageFilter.h"6#include"itkImageFile......
  • C#实现用正则表达式替换JSON中大字段的内容
    ///<summary>///过长的数据在日志中不显示///</summary>///<paramname="orilog">原请求</param>///<paramname="ignore">需要过滤的参数</param>privatestringRemoveIgnor......
  • ChatGPT 问答00017 在Disruptor中,WorkHandler使用案例
    在Disruptor中,WorkHandler通常用于实现多线程消费事件的场景。下面是一个简单的示例,展示了如何使用WorkHandler:假设我们有一个RingBuffer,用于存储事件,并且有多个工作线程需要并发地处理这些事件。我们定义一个名为Event的类作为事件对象,并创建一个EventWorkHandler来处理这些事......
  • 《Lua程序设计第四版》 第二部分14~17章自做练习题答案
    Lua程序设计第四版第二部分编程实操自做练习题答案,带⭐为重点。14.1⭐该函数用于两个稀疏矩阵相加functionmartixAdd(a,b)localc={}fori=1,#a,1doc[i]={}fork,vinpairs(a[i])doc[i][k]=vendend......
  • 漏洞复现报告:CVE-2017-7103 JQuery框架XSS漏洞
    1.简介jQuery是一个快速、简洁的JavaScript框架,是一个丰富的JavaScript代码库。jQuery设计的目的是为了写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。据一项调查报告,在对4......
  • Apache Flink目录遍历漏洞复现CVE-2020-17519
    ApacheFlink目录遍历漏洞复现CVE-2020-17519前置知识ApacheFlink:ApacheFlink是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。漏洞利用条件:ApacheFlink版本为1.11.0......
  • 正则表达式
    正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种我们所需要的子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。  JavaScript和Java使用正则表达式的区别JavaScript使用正则表达式创建正则对象RegExp对......