python使用正则匹配判断字符串中含有某些特定子串及正则表达式详解

目录

一、判断字符串中是否含有字串

二、正则表达式

(一)基本内容

1.正则表达式修饰符——可选标志

2.正则表达式模式

(二)常见表达式函数


一、判断字符串中是否含有字串

  1. innot in

判断字符串中是否含有某些关键词,方法比较多 例如分词后对词向量和关键词进行==匹配,但这种方法以来分词的准确性,不太推荐; 其次使用成员运算符in,not in可以较好的判断字符串中是否包含某关键词,即特定字串

a = '这个暑假我读了红楼梦和三国演义'
b= ['三国演义','水浒传','西游记','红楼梦']
n = 0
for i in b:if i in a:n += 1
print(f'四大名著暑假读了{n}本')

这种遍历算法虽然可以成功得到想要的结果,但是当数据量很大的时候,程序执行效率将会很低。正则匹配作为专业的查找工具,在判断字符串中含有特定字串的事情上可以大大提高工作效率。

2.正则匹配re.findall

import re
def is_in(fullstr,substr):if re.findall(substr,fullstr):return 1else:return 0
a = '这个暑假我读了红楼梦和三国演义'
b= ['三国演义','水浒传','西游记','红楼梦']
n = 0
for i in b:n = is_in(a,i)n += 1
print(f'四大名著暑假读了{n}本')

findall:返回string中所有与pattern匹配的全部字符串,返回形式为数组

re.findall(pattern, string, flags``=``0``)

示例如下:

line = []
n = 0
for i in b:num = is_in(a,i)n += numres = re.findall(i,a)line = line + res 
print(f'四大名著暑假读了{n}本')
print(f'分别是{line}')
'''
res = re.findall(i,a)      re.findall返回值是一个列表
out:
四大名著暑假读了2本
分别是['三国演义', '红楼梦']
'''

正则的功能十分强大,上述使用的只是其中一个很小的功能。下面继续对正则的强大功能进行学习

二、正则表达式

(一)基本内容

1.正则表达式修饰符——可选标志

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志

修饰符功能全称
re.I匹配忽略大小写re.IGNORECASE
re.L做本地化识别(locale-aware)匹配,即表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境(该标记官方已经不推荐使用)re.LOCALE
re.M多行匹配,影响^$(正则表达式中^表示匹配行的开头,默认模式下它只能匹配字符串的开头;而在多行模式下,它还可以匹配 换行符\n后面的字符。NOTE:正则语法中^匹配行开头、\A匹配字符串开头,单行模式下它两效果一致,多行模式下\A不能识别\nre.MULTILINE
re.S使·.匹配包括换行在内的所有字符(DOT表示.,ALL表示所有,连起来就是.匹配所有,包括换行符\n。默认模式下.是不能匹配行符\n的)re.DOTALL
re.U表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库(与 ASCII 模式类似,匹配unicode编码支持的字符,但是 Python 3 默认字符串已经是Unicode,所以有点冗余)re.UNICODE
re.X增加可读性,忽略空格和 # 后面的注释 (默认模式下并不能识别正则表达式中的注释,而详细模式是可以识别的)re.VERBOSE
re.A让 \w, \W, \b, \B, \d, \D, \s 和 \S 只匹配ASCII,而不是Unicodere.ASCII
re.DEBUG显示编译时的debug信息re.DEBUG

2.正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式: (1)字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。 (2)多数字母和数字前加一个反斜杠时会拥有不同的含义,例如\n表示换行。 (3)标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。 (4)反斜杠本身需要使用反斜杠转义。 (5)由于正则表达式通常都包含反斜杠,所以最好使用原始字符串来表示它们。模式元素(如 r'\t',等价于 '\\t')匹配相应的特殊字符。

下表列出了正则表达式模式语法中的特殊元素。如果使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

模式功能示例匹配的字符串
^匹配字符串的开头
$匹配字符串的结尾
.匹配任意字符,除了换行符\n
[…]表示一组字符单独列出[like]'l','i','k' 'e'
[^…]表示不在[]中的字符[^like]除了'l','i','k' ,e之外的字符
\w匹配字母数字及下划线a-zA-Z0-9_
\W匹配非字母数字及下划线
\s匹配任意空白字符,等价于\t \n \r \f
\S匹配任意非空字符
\d匹配任意数字,等价于 [0-9]
\D匹配任意非数字
\A匹配字符串开始
\z匹配字符串结束
\Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\G匹配最后匹配完成的位置
\b匹配一个单词边界,也就是指单词和空格间的位置er\bnever (√),verb(×)
\B匹配非单词边界er\bnever (×),verb(√)
\n \t匹配一个换行符。匹配一个制表符。等
\1\9匹配第n个分组的内容
\10匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式
re*(* 贪婪)匹配0个或多个表达式(前一个字符出现0次或者⽆限次,即可有可⽆)abc*abccc
re+(+懒惰)匹配1个或多个的表达式(前一个字符出现1次或者⽆限次,即⾄少有1次)abc+abc abcccc
re?(占有)匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式(前一个字符出现1次或者0次,即要么有1次,要么没有)abc?abc ab
re{n}前一个字符出现n次o{2}food
{m,n}匹配前⼀个字符出现从m到n次,若省略m,则匹配0到n次,若省略n,则匹配m到无限次ab{1,2}cabc abbc
a |b匹配a或b
(re)对正则表达式分组并记住匹配的文本
\num引⽤分组num匹配到的字符串
(?P<name>)分组起别名,匹配到的子串组在外部是通过定义的 name 来获取的
(?P=name)引⽤别名为name分组匹配到的字符串

(二)常见表达式函数

正则表达式是一个特殊的字符序列,可以方便的检查一个字符串是否与某种模式匹配,python自带的re模块使 Python 语言拥有全部的正则表达式功能 python常用的正则表达式函数如下:

功能分类函数功能
查找一个匹配项re.search查找任意位置的匹配项
re.match必须从字符串开头匹配
re.fullmatch整个字符串与正则完全匹配
查找多个匹配项re.findall从字符串任意位置查找,返回一个列表
re.finditer从字符串任意位置查找,返回一个迭代器
分割re.split用正则表达式将某字符串分割成多段
替换re.sub替换掉某字符串中被正则表达式匹配的字符,返回替换后的字符串,替换可以是字符串 也可以是 函数
re.subn替换掉某字符串中被正则表达式匹配的字符,返回替换后的字符串 和 替换次数
编译正则对象re.compile将正则表达式的样式编译为一个 正则表达式对象 (正则对象Pattern)
re.template将正则表达式的样式编译为一个 正则表达式对象 ,并添加re.TEMPLATE模式
其他re.escape可以转义正则表达式中具有特殊含义的字符,比如: . 或者 *
re.purge清除正则表达式缓存
  1. re.match

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none

re.match(pattern, string, flags``=``0``)

参数说明
pattern匹配的正则表达式
string要匹配的字符串
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。详见表1修饰符

匹配成功 re.match方法返回一个匹配的对象,否则返回 None 可以使用 group(num)groups()匹配对象函数来获取匹配表达式

匹配对象方法描述
group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组
groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号

0:表示正则表达式中符合条件的字符串。 1:表示正则表达式中符合条件的字符串中的第一个() 中的字符串。 2:表示正则表达式中符合条件的字符串中的第二个() 中的字符串。 以此类推…

import re
fullstr = 'name:alice,result:89'
result = re.match('name:(\w+),result:(\d+)', fullstr)
print(result)
print(result.group(0))
print(result.group(1))
print(result.group(2))
print(result.group())import` `re``fullstr ``=` `'name:alice,result:89'``result ``=` `re.match(``'name:(\w+),result:(\d+)'``, fullstr)``print``(result)``print``(result.group(``0``))``print``(result.group(``1``))``print``(result.group(``2``))``print``(result.group())

结果:

out1: <re.Match object; span=(0, 20), match=‘name:alice,result:89’> out2: name:alice,result:89 out3: alice out4: 89 out5: name:alice,result:89

从结果可以看出,re.match()方法返回一个匹配的对象,而不是匹配的内容。通过调用span()可以获得匹配结果的位置。而如果从起始位置开始没有匹配成功,即便其他部分包含需要匹配的内容,re.match()也会返回None 可以使用group()来提取每组匹配到的字符串。 group()会返回一个包含所有小组字符串的元组,从 0 到 所含的小组号

注意:如果在运用正则表达式做匹配的过程中没有匹配到元素,之后又调用了group(),会报错:AttributeError: 'NoneType' object has no attribute 'group' 如果出现这种报错,可以将match改成search()就可以避开这类问题了。search函数是先扫描全部的代码块,再进行提取的

2.re.search

re.search会匹配整个字符串,并返回第一个成功的匹配。如果匹配失败,则返回None

re.search(pattern, string, flags``=``0``)

参数同re.match

示例:

import re
fullstr = 'class:1班,name:alice,result:89'
result = re.match('name:(\w+),result:(\d+)', fullstr)
print(result)
print(result.group(0))

out1: None out2: AttributeError: ‘NoneType’ object has no attribute ‘group’ 原因:match在起始位置匹配,如果不是起始位置匹配成功的话,match() 就返回 none

尝试search

import re
fullstr = 'class:1班,name:alice,result:89'
result = re.search('name:(\w+),result:(\d+)', fullstr)
print(result)
print(result.group(0))
print(result.group(1))
print(result.group(2))
print(result.group())

out1: <re.Match object; span=(9, 29), match=‘name:alice,result:89’> out2: name:alice,result:89 out3: alice out4: 89 out5: name:alice,result:89

  1. re.sub

该函数主要用于替换字符串中的匹配项

re.sub(pattern, repl, string, count``=``0``, flags``=``0``)

示例如下:

参数说明
pattern必须参数:正则中的模式字符串
repl必须参数:替换的字符串,也可为一个函数
string必须参数,要被查找替换的原始字符串
count可选参数,模式匹配后替换的最大次数,默认 0 表示替换所有的匹配
flags可选参数,表示编译时用的匹配模式(如忽略大小写、多行模式等),数字形式,默认为0
#修改分数
fullstr = 'name:alice,result:89'
res1 = re.sub(r'\d+','90',fullstr)
print(res1)

out: name:alice,result:90

repl可以为一个函数。如下:

#修改分数
def change(matched):value = int(matched.group('value'))return str(value + 1)
fullstr = 'name:alice,result:89'
res1 = re.sub('(?P<value>\d+)',change,fullstr)
print(res1)

out: name:alice,result:90

4.re.compile

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用 re 模块的一般使用步骤是:

1.使用 compile 函数将正则表达式的字符串形式编译为一个 Pattern 对象 2.通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果(一个 Match 对象) 3.最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作里是引用

re.``compile``(pattern, flags)

compile返回的是一个匹配对象,它单独使用就没有任何意义,需要和findall(), search(), match()搭配使用

5.re.findall

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表 match 和 search 是匹配一次 findall 匹配所有

6.re.split

re.split(pattern, string[, maxsplit``=``0``, flags``=``0``])

到此这篇关于python使用正则匹配判断字符串中含有某些特定子串 及 正则表达式详解的文章就介绍到这了,希望对大家有帮助。

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

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

相关文章

hashmap的get原理

HashMap的 get() 方法用于根据给定的键获取对应的值。下面是HashMap的get()方法的大致原理&#xff1a; 首先&#xff0c;get() 方法会计算传入键的哈希码&#xff08;hash code&#xff09;。通过调用键对象的 hashCode() 方法来获取键的哈希码。 接下来&#xff0c;get() 方…

使用easyExcel 定义表头 字体 格式 颜色等,定义表内容,合计

HeadStyle 表头样式注解 HeadFontStyle 表头字体样式 HeadStyle(fillPatternType FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor 22) HeadFontStyle(fontHeightInPoints 12) 以下为实现效果

python实现rdbms和neo4j的转换

python&neo4j 一、连接neo4j二、rdbms转换到neo4j三、常见报错<一>、ValueError: The following settings are not supported 一、连接neo4j 下载依赖库 pip install py2neo连接neo4j from py2neo import Graph graph Graph("bolt://localhost:7687", …

Unity BuffSystem buff系统

Unity BuffSystem buff系统 一、介绍二、buff系统架构三、架构讲解四、框架使用buff数据Json数据以及工具ShowTypeBuffTypeMountTypeBuffOverlapBuffShutDownTypeBuffCalculateType时间和层数这里也不过多说明了如何给生物添加buff 五、总结 一、介绍 现在基本做游戏都会需要些…

leetcode-3的幂

326. 3 的幂 题解&#xff1a; 要判断一个整数是否是3的幂次方&#xff0c;我们可以使用循环或递归的方法。首先&#xff0c;我们需要处理一些特殊情况&#xff0c;例如当n为0时&#xff0c;返回false&#xff1b;当n为1时&#xff0c;返回true。然后&#xff0c;我们可以通过…

【Nicn的刷题日常】之有序序列合并

1.题目描述 描述 输入两个升序排列的序列&#xff0c;将两个序列合并为一个有序序列并输出。 数据范围&#xff1a; 1≤&#xfffd;,&#xfffd;≤1000 1≤n,m≤1000 &#xff0c; 序列中的值满足 0≤&#xfffd;&#xfffd;&#xfffd;≤30000 0≤val≤30000 输入描述…

学习总结15

# 封印 ## 题目背景 很久以前&#xff0c;魔界大旱&#xff0c;水井全部干涸&#xff0c;温度也越来越高。为了拯救居民&#xff0c;夜叉族国王龙溟希望能打破神魔之井&#xff0c;进入人界“窃取”水灵珠&#xff0c;以修复大地水脉。可是六界之间皆有封印&#xff0c;神魔之…

C++基础知识点预览

一.绪论&#xff1a; 1.1 C简史&#xff1a; 与C的关系&#xff1a; 被设计为C语言的继任者&#xff0c;C语言是一种过程型语言&#xff0c;程序员使用它定义执行特定操作的函数&#xff0c;而C是一种面向对象的语言&#xff0c;实现了继承、抽象、多态和封装等概念。C支持类&…

【RPA】智能自动化的未来:AI + RPA

伴随着人工智能&#xff08;AI&#xff09;技术的迅猛进步&#xff0c;机器人流程自动化&#xff08;RPA&#xff09;正在经历一场翻天覆地的变革。AI为RPA注入了新的活力&#xff0c;尤其在处理复杂任务和制定决策方面。通过融合自然语言处理&#xff08;NLP&#xff09;、机器…

从0开始学Docker ---Docker安装教程

Docker安装教程 本安装教程参考Docker官方文档&#xff0c;地址如下&#xff1a; https://docs.docker.com/engine/install/centos/ 1.卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest…

《学成在线》微服务实战项目实操笔记系列(P1~P83)【上】

史上最详细《学成在线》项目实操笔记系列【上】&#xff0c;跟视频的每一P对应&#xff0c;全系列12万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。 一、前期准备 1.1 项目介绍 P2 To C面向…

C语言-----自定义类型-----结构体

结构体和数组一样&#xff0c;都是一群数据的集合&#xff0c;不同的是数组当中的数据是相同的类型&#xff0c;但是结构体中的数据类型可以不相同&#xff0c;结构体里的成员叫做成员变量 结构体类型是C语言里面的一种自定义类型&#xff0c;我们前面已经了解到过int,char,fl…

jvm垃圾收集器之七种武器

目录 1.回收算法 1.1 标记-清除算法(Mark-Sweep) 1.2 复制算法(Copying) 1.3 标记-整理算法(Mark-Compact) 2.HotSpot虚拟机的垃圾收集器 2.1 新生代的收集器 Serial 收集器&#xff08;复制算法&#xff09; ParNew 收集器 (复制算法) Parallel Scavenge 收集器 (复制…

熔断机制解析:如何用Hystrix保障微服务的稳定性

微服务与系统的弹性设计 大家好,我是小黑,在讲Hystrix之前,咱们得先聊聊微服务架构。想象一下,你把一个大型应用拆成一堆小应用,每个都负责一部分功能,这就是微服务。这样做的好处是显而易见的,更新快,容错性强,每个服务可以独立部署,挺美的对吧?但是,问题也随之而…

Win10系统备份的几种方案,以后不重装系统,备份系统恢复Backup,系统映像备份

Win10系统备份的几种方案 其实都不想重装系统&#xff0c;每次都不愿意去安装各种软件&#xff0c;麻烦&#xff0c;其实win10有几种备份的方案&#xff0c;可以参考一下。 如果下次出问题&#xff0c;我就将系统恢复到这个状态即可&#xff0c;真的不想重装系统&#xff0c;还…

Stable Diffusion 模型下载:Schematics(原理图)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十下载地址模型介绍 “Schematics”是一个非常个性化的LORA,我的目标是创建一个整体风格,但主要面向某些风格美学,因此它可以用于人物、物体、风景等。这次你会得到“连线”和“方案”…

Unity学习笔记(零基础到就业)|Chapter02:C#基础

Unity学习笔记&#xff08;零基础到就业&#xff09;&#xff5c;Chapter02:C#基础 前言一、复杂数据&#xff08;变量&#xff09;类型part01&#xff1a;枚举数组1.特点2.枚举&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;申明枚举变量&#xff08;3&#xff…

Java毕业设计-基于ssm的仓库管理系统-第76期

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssm的游泳馆管理系统&#xff1a;前端jsp、jquery、bootstrap&#xff0c;后端 springmvc、spring、mybatis&#xff0c;集成游泳课程报名、游泳卡在线售卖、购物车、…

Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(二)

gnome-builder创建的程序&#xff0c;在工程树中有三个重要程序&#xff1a;main主程序、application应用程序和window主窗口程序。main整个程序的起始&#xff0c;它会操作application生产应用环境&#xff0c;application会操作window生成主窗口&#xff0c;于是就有了 appli…

Mysql分表和表分区详解

为什么要分表和分区&#xff1f; 日常开发中我们经常会遇到大表的情况&#xff0c;所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大&#xff0c;导致数据库在查询和插入的时候耗时太长&#xff0c;性能低下&#xff0c;如果涉及联合查询的情况&#xff0c;…