正则匹配括号里面的内容不包括括号_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,一经查实,立即删除!

相关文章

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

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

使用Nant构建入门

前言:NAnt是一项开源的项目,利用NAnt,你可以方便快捷地对自己.NET项目或解决方案进行自动构建。与VS中可视化化极强的项目和解决方案管理相比,NAnt只能命令行的方式操作,但是这并不影响Nant的流行。NAnt可以根据我们的…

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也有很大的局限性,比如:首列必须为查找依据列 无法简单的多条件匹配 横向查找等等往往需要进行一些复杂操作的时候我们都需要修改…

基于C8051F040单片机的CAN总线测试模式研究

摘要:现场总线已成为数据总线领域中最为活跃的热点,CAN总线被公认为最有前途的现场总线之一,CAN总线节点的设计、调试是CAN总线通讯系统设计的重点。在此介绍了C8051F040单片机内部集成的CAN控制器,并基于C8051F040单片机设计了一…

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…

CAN总线技术在船舶监控系统的应用

AN(Controller Area Network),即控制局域网,是一种具有很高可靠性、支持分布式和实时控制的串行通信网络。CAN为多主方式工作,网络上任意节点均可在任意时刻主动地向网络上其它节点发送信息,而不分主从,且无需站地址等节点信息,通讯灵活。CAN协议模型结构只有3层,即只取OSI底层…

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管…

Some Notes About Design Pattern

针对接口编程而不是实现 优先使用对象组合,而不是类继承 封装变化点 使用重构到模式,而不是直接使用设计模式 设计模式是好的面向对象设计,所以只有掌握面向对象才能更好的理解和应用设计模式 单一职责原则:一个类应该只有一个引起…

M16C

R8C/M16C提供一系列预处理指令,能够很好的优化C代码。 本文以nc30编译器为例,谈谈#pragma的用法。 1)。与内存有关的命令 #pragma ROM 将一个变量放入ROM里面,比如: #pragma ROM aa int aa; #pragma BIT 位变量申明。表…

ASP+AJAX制作无刷新新闻评论系统01

传统:上半部分评论列表直接通过数据库查询语句读取并显示,每当提交新的评论时,先传递给处理页面,处理页面处理完毕后再返回index.asp这个页面,当然index.asp是重新加载获得新的评论。  Ajax::首先列表页面…

修改Fiddler实用插件JsonViewer

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

百度的算法面试题

第一题: 某个公司举行一场羽毛球赛,有1001个人参加,现在为了评比出“最厉害的那个人”,进行淘汰赛,请问至少需要进行多少次比赛。 淘汰赛,一场淘汰一个人,自然就需要1000场,根本不…

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

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