正则匹配括号里面的内容不包括括号_python正则表达式

是一个计算机科学概念用于使用单个字符串来描述,匹配某个规则的字符串常常用来检索,替换某些模式的文本

正则的写法

  • .(点号):表示任意一个字符,除了
  • [](中括号),匹配括号中列举的范围,如[0-9]代表任意单个字数,[a-z]代表任意单个小写字母
  • d: 任意一个数字
  • D:除了数字都可以
  • s:表空格,tab键
  • S:除了空格,tab键之外
  • w:单词字符,a-z,A-Z,0-9,_
  • W:除了字母和数字
  • *:表示前面的内容重复零次或者多次
  • +:表面前面内容至少出现一次
  • ?:表面前面的内容出现一次或者零次
  • {m, n} :出现m到n次
  • ^ :匹配字符串的开头
  • $:匹配字符串的结尾
  • ():对正则表达式的内容进行分组,从第一个括号开始
  • A:匹配字符串开始
  • Z:匹配字符串末尾
  • |:左右任意一个

使用大致步骤

  1. 使用compile将表示正则的字符串编译为一个pattern对象
  2. 利用Pattern对象提供的方法,对文本进行匹配,获取匹配结果
  3. 最后利用match对象提供的属性和方法后去信息,根据需要进行操作

常用匹配方法

match匹配

  • 必须从第一个字符开始就能匹配上,否则匹配失败
  • 返回的结果只有一个,并且支持group分组
import retext = '1234aash34235235fdosdf'p = re.compile('[0-9]*')result = p.match(text)print(result)print(result.group())print(result.span())"""输出结果1234(0, 4)"""

返回结构体re.Match

  • span:表示匹配的跨度,从哪里匹配,到哪里结束,左包括右边不包括
  • group:表示匹配的组,如果只有一组则直接打印内容
  • start:显示开始匹配的字符串的位置
  • end:表示结束字符串的位置
  • groups:当正则里面出现括号时搭配使用
import retext = '1234aash34235235fdosdf'p = re.compile('([0-9]*)')  # 这里多了一个括号result = p.match(text)print(result)print(result.group())print(result.groups())print(result.span())"""1234('1234',)(0, 4)"""

search匹配

  • 与match基本一致,也只返回一个结果
  • 但是可以不用从开头位置匹配
  • 返回一个结果,支持group分组
import retext = 'a1234aash34235235fdosdf'p = re.compile('[0-9]+')result = p.search(text)print(result)print(result.group())"""1234"""

findall匹配

  • 匹配所有能匹配到的结果
  • 不支持group分组,默认返回一个列表
import retext = 'a1234aash34235235fdosdf'p = re.compile('[0-9]+')result = p.findall(text)print(result)"""['1234', '34235235']"""

finditer匹配

  • 匹配所有能匹配到的结果
  • 默认返回一个迭代,由re.Match迭代而成,可以通过for循环取出
  • re.Match支持group分组
import retext = 'a1234aash34235235fdosdf'p = re.compile('[0-9]+')result = p.finditer(text)print(result)for r in result:    print(r)    print(r.group())"""123434235235"""

sub替换

  • 可以用sub替换要匹配的字符
  • sub为批量替换,即可以替换多个位置
import retext = 'a1234aash34235235fdosdf'p = re.compile('[0-9]+')result = p.sub('0', text)  # 把结果全部替换为0print(result)"""a0aash0fdosdf"""

group与groups的区别

  • group与groups都属于re.Match的内置属性
  • group用于直接显示匹配结果,而groups用于提取匹配结果中的值
  • 以提取百度网页title为例
import reimport requestsurl = 'https://www.baidu.com'headers = {    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)     Chrome/80.0.3987.149 Safari/537.36'}response = requests.get(url, headers=headers)html = response.textp = re.compile('(.*?)')  # 提取title中间的值result = p.search(html)print(result.group())print(result.groups())"""百度一下,你就知道('百度一下,你就知道',)"""
可以看出,group直接把整个匹配的结果都提取出来了groups只提取了匹配值中括号的部分,并且需要搭配()括号使用并且group的结果是一个字符串,而groups的结果是一个tuple如果存在多个组的时候,两个结果更不相同
import retext = '2020-04-05'p = re.compile('([0-9]{4})-([0-9]{2})')   # 这里分了两个组,一组提取年份,一组提取月份result = p.search(text)print(result)print(result.group())  # 打印匹配值print(result.groups())  # 打印匹配结果,返回一个tupleprint(result.group(0))  # 打印所有组,和group()一样print(result.group(1))  # 打印第一组的匹配值print(result.group(2))  # 打印第二组的匹配值print(result.groups(0))  # 打印所有匹配结果,和groups一样的
可以看出,group和groups里面是否加零结果都是一样的,即返回所有组group可以指定返回第几组的值,相对来说更好筛选groups直接返回匹配的所有值根据这里特性,我们可以重新使用group对上面的百度标题进行爬取
import reimport requestsurl = 'https://www.baidu.com'headers = {    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)     Chrome/80.0.3987.149 Safari/537.36'}response = requests.get(url, headers=headers)html = response.textp = re.compile('(.*?)')  # 提取title中间的值result = p.search(html)print(result.group())print(result.group(1))  # 把第1组的结果打印出来print(result.groups())"""百度一下,你就知道百度一下,你就知道('百度一下,你就知道',)"""

正则表达式修饰符

e4696d4d52f2cac74a121014534105bc.png

re.I演示

假设想要匹配所有字母,不区分大小写

import retext1 = 'shdfi1234SHDFISHDI'p = re.compile('[a-z]+', re.I)  # 不区分大小写,所有字母都匹配result = p.findall(text1)print(result)"""['shdfi', 'SHDFISHDI']"""

re.M演示

  • 假设匹配以sh开头以2结尾的字符串
import retext1 = 'sh22dfi1234SHDFIssSHDI'p = re.compile('^sh.*2$', re.M)  # 匹配多行,即忽略回车匹配所有小写字母p2 = re.compile('^sh.*2$')result = p.findall(text1)result2 = p2.findall(text1)print(result)print(result2)"""['sh22dfi12'][]"""
可以看出,在多行模式下,一个字符串根据回车符号被拆分成两行,即有两个开头与结尾。

re.S演示

  • 假设匹配一个d..I的字符串
import retext1 = 'sh22dfi1234SHDFIssSHDI'p1 = re.compile('d.*I')p2 = re.compile('d.*I', re.S)  # 让点号也能匹配换行符result1 = p1.search(text1)result2 = p2.search(text1)print(result1)  # 目前没有匹配上print(result2.group())  # 从下面的结果来看换行符也被匹配上了"""Nonedfi1234SHDFIssSHDI"""

匹配中文

  • 匹配中文[一-龥],不包括全角标点

贪婪匹配与非贪婪匹配

. *和.*?

import retext = '12ddd345'# 匹配一个数字开头数字结尾的字符串p1 = re.compile('[0-9].*[0-9]')  # 贪婪模式p2 = re.compile('[0-9].*?[0-9]')  # 非贪婪模式result1 = p1.search(text)result2 = p2.search(text)print(result1.group())print(result2.group())"""12ddd34512"""
  • 正则表达式默认使用贪婪匹配
import retext = u'123你好bbabd'p1 = re.compile(u'[一-龥]{1,2}')  # 匹配一个或者两个中文result1 = p1.search(text)print(result1.group())  # 打印结果是匹配两个"""你好"""
  • 如果使用非贪婪匹配
import retext = u'123你好bbabd'p1 = re.compile(u'[一-龥].*?')  # 匹配一个或者两个中文result1 = p1.search(text)print(result1.group())  # 打印结果是匹配一个"""你"""

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

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

相关文章

专业程序员必知必会的技巧:驯服复杂代码

你从入职第一天起就要应对复杂代码。 若是还未遇到过无法理解的程序,那说明你编程的年头还不够长。在行业里,要不了多久你就会碰到让人发懵的混乱代码:巨兽、面条工厂、来自地狱的遗留系统。我曾接手过一个程序,它的前任在听说要…

LSGO软件技术团队2015~2016学年第五周(0928~1004)总结

一个充满正能量的学习型团队! 简简单单做人,快快乐乐做事! 本周签到情况统计(第五周0928至1004): 团队技术博客账号统计(第五周0928至1004): 实验室工作台使用情况统计&…

香肠派对电脑版_《香肠派对》是不是除了《和平精英》最成功的吃鸡手游:靠恶搞火了?...

我们知道,自从《绝地求生》自国内外火了之后,国内陆续上线了大大小小不少于10款各种类型的吃鸡手游,从最早的《丛林法则》、到瞬间倒下的《荒野行动》,再到现在最火的《和平精英》和后面即将上线的武侠吃鸡《江湖求生》。国内的游…

C/C++程序员必读的十本书(上)

在Gmail TopLanguage Group 中看到一篇文章“C/C程序员必读的十本书(上)”,大家的讨论都很激励,大家都觉得这篇文章写得很棒,我想在Group里的朋友都能在Lookgirl的这篇文章里获益不少,为此斗胆在此转载该文…

LSGO软件技术团队2015~2016学年第六周(1005~1011)总结

LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为数据分析与计算机视觉。成立几年来为学校培养了一批优秀学生&a…

Silverlight反编译系列二常见代码(自动生成属性CompilerGenerated,代码)

在Silverlight有一些编译后自动生成的代码,最常见的是CompilerGeneratedAttribute和DebuggerNonUserCodeAttribute,下面介绍一下这俩种属性 1.CompilerGeneratedAttribute 自动属性 使用自动属性后,你可以不用手工声明一个私有成员变量以及编…

frontcon函数用不了_真香警告!用了XLOOKUP再也回不去VLOOKUP了

作为一名社畜,Excel是必备技能。如果你不会vlookup函数,都不好意思跟别人说你会用Excel。但vlookup也有很大的局限性,比如:首列必须为查找依据列 无法简单的多条件匹配 横向查找等等往往需要进行一些复杂操作的时候我们都需要修改…

LSGO软件技术团队爬山活动

LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为数据分析与计算机视觉。成立几年来为学校培养了一批优秀学生&a…

HDOJ 2526 HDU 2526 浪漫手机 ACM 2526 IN HDU

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid2526题目描述:浪漫手机Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 362 Accepted Submissi…

2引擎帮助文档_Simcenter Amesim 16液压部分帮助文档中英文对照(2)

10/49 Hydraulic Component Design Library10/49液压元件设计库The simplest possible check valve consists of a ball which is free to move over a limited displacement.In one extreme position it is fully closed and completely blocks the flow, and in the other ex…

ArcGIS Engine Runtime 10 Setup步骤

首先安装ArcGIS License Manager 10 Setup 其次安装ArcGIS Engine Runtime 10 Setup 再次,拷贝service.txt文件到ArcGIS\License10.0\bin文件夹下,替换原有文件。 运行ArcGIS 许可服务管理器 - 10.0,启动服务。 最后,运行ArcGIS管…

修改Fiddler实用插件JsonViewer

在Web开发中,Fiddler是我们常用的工具,JSON是我们常用的数据格式。本文所要说的JsonViewer就是一款在Fiddler中查看JSON对象的小插件(当然它不仅仅是作为Fiddler的插件,还有独立运行版和Visual Studio的插件)。关于它的…

matlab用regress方法求ln函数_数学篇|高中数学48条秒杀型公式与方法,一定要掌握!...

「 致于学教育 」高中数学48条秒杀型公式1.适用条件:[直线过焦点],必有ecosA(x-1)/(x1),其中A为直线与焦点所在轴夹角,是锐角。x为分离比,必须大于1。注上述公式适合一切圆锥曲线。如果焦点内分(指的是焦点在所截线段上…

LSGO软件技术团队对外技术交流

LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为数据分析与计算机视觉。成立几年来为学校培养了一批优秀学生&a…

大型项目使用Automake/Autoconf完成编译配置

使用过开源C/C项目的同学们都知道,标准的编译过程已经变成了简单的三部曲:configure/make/make install, 使用起来很方便,不像平时自己写代码,要手写一堆复杂的Makefile,而且换个编译环境,Makefile还需要修…

java中数组的返回值是什么类型_Java数组也是一种数据类型

Java 的数组要求所有的数组元素具有相同的数据类型。因此,在一个数组中,数组元素的类型是唯一的,即一个数组里只能存储一种数据类型的数据,而不能存储多种数据类型的数据。因为 Java 语言是面向对象的语言,而类与类之间…

LSGO软件技术团队内部技术交流

LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为数据分析与计算机视觉。成立几年来为学校培养了一批优秀学生&a…

LSGO软件技术团队2015~2016学年第七周(1012~1018)总结

LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为数据分析与计算机视觉。成立几年来为学校培养了一批优秀学生&a…

idea查询类_Spring Security入门(三): 基于自定义数据库查询的认证实战

0 引言在笔者的上一篇文章中Spring Security入门(二):基于内存的认证一文中有提到过Spring Security实现自定义数据库查询需要你实现UserDetailsService接口,并实现loadUserByUsername(String username)抽象方法。我们可以在UserDetailsService接口的实现…

python计算小数点后有几位_python的数字类型

python的数字类型分为三种,分别是整数int、 浮点数float 和 复数complex。数字是由数字字面值或内置函数与运算符的结果来创建的, 不带修饰的整数字面值会生成整数。包含小数点或幂运算符的数字字面值会生成浮点数。在数字字面值末尾加上 j 或 J 会生成虚…