正则表达式分组

分组就是用一对圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组。从正则表达式的左边开始看,看到的第一个左括号“(”表示第一个分组,第二个表示第二个分组,依次类推,需要注意的是,有一个隐含的全局分组(就是0),就是整个正则表达式。

分完组以后,要想获得某个分组的内容,直接使用group(num)和groups()函数去直接提取就行。

例如:提取代码中的超链接中的文本

>>> s='

更多

dfsl

'

>>> print re.search(r'(.*)',s).group(1)

更多

或者

>>> print re.match(r'.*(.*)',s).group(1)

更多

按照上面的分组匹配以后,我们就可以拿到我们想拿到的字串,但是如果我们正则表达式中括号比较多,那我们在拿我们想要的字串时,要去挨个数我们想要的字串时第几个括号,这样会很麻烦,这个时候Python又引入了另一种分组,那就是命名分组,上面的叫无名分组。

命名分组

命名分组就是给具有默认分组编号的组另外再给一个别名。命名分组的语法格式如下:

(?P正则表达式)#name是一个合法的标识符

如:提取字符串中的ip地址

>>> s = "ip='230.192.168.78',version='1.0.0'"

>>> re.search(r"ip='(?P\d+\.\d+\.\d+\.\d+).*", s)

>>> res.group('ip')#通过命名分组引用分组

'230.192.168.78'

后向引用

正则表达式中,放在圆括号“()”中的表示是一个组。然后你可以对整个组使用一些正则操作,例如重复操作符。

要注意的是,只有圆括号”()”才能用于形成组。”“用于定义字符集。”{}”用于定义重复操作。

当用”()”定义了一个正则表达式组后,正则引擎则会把被匹配的组按照顺序编号,存入缓存。这样我们想在后面对已经匹配过的内容进行引用时,就可以用”\数字”的方式或者是通过命名分组进行”(?P=name)“进行引用。\1表示引用第一个分组,\2引用第二个分组,以此类推,\n引用第n个组。而\0则引用整个被匹配的正则表达式本身。这些引用都必须是在正则表达式中才有效,用于匹配一些重复的字符串。

如:

#通过命名分组进行后向引用

>>> re.search(r'(?Pgo)\s+(?P=name)\s+(?P=name)', 'go go go').group('name')

'go'

#通过默认分组编号进行后向引用

>>> re.search(r'(go)\s+\1\s+\1', 'go go go').group()

'go go go'

交换字符串的位置

>>> s = 'abc.xyz'

>>> re.sub(r'(.*)\.(.*)', r'\2.\1', s)

'xyz.abc'

前向肯定断言、后向肯定断言

前向肯定断言的语法:

(?=pattern)

后向肯定断言的语法:

(?<=pattern)

需要注意的是,如果在匹配的过程中,需要同时用到前向肯定断言和后向肯定断言,那么必须将后向肯定断言写在正则语句的前面,前向肯定断言写在正则语句的后面,表示后向肯定模式之后,前行肯定模式之前。

如:获取c语言代码中的注释内容

>>> s1='''char *a="hello world"; char b='c'; /* this is comment */ int c=1; /* t

his is multiline comment */'''

>>> re.findall( r'(?<=/\*).+?(?=\*/)' , s1 ,re.M|re.S)

[' this is comment ', ' this is multiline comment ']

(?<=/*)这个是后向肯定断言,表示“/*”之后。(?=*/)这个为前向肯定断言,表示“*/”之前,这两合并起来就是一个区间了,所以后向肯定断言放在前向肯定断言前面。

前向否定断言、后向否定断言

前向否定断言语法:

(?!pattern)

后向否定断言语法:

(?

前向否定和后向否定实例:

#提取不是.txt结尾的文件

>>> f1 = 'aaa.txt'

>>> re.findall(r'.*\..*$(?

[]

#提取不以数字开头的文件

>>> re.findall(r'^(?!\d+).*','1txt.txt')

[]

#提取不以数字开头不以py结尾的文件

>>> re.findall(r'^(?!\d+).+?\..*$(?

[]

>>> re.findall(r'^(?!\d+).+?\..*$(?

['test.txt']

python中分割字符串两种方法正则分组别名_Python 正则表达式(分组)相关推荐

  1. python中分割字符串两种方法正则分组别名,如何在python中使用正则表达式模块将文本字符串分割成单词?...

    Here's what I'm working with- string1 = "Dog,cat,mouse,bird. Human." def string_count(text ...

  2. python遍历数组的两种方法及将print的内容写入文件中

    python遍历数组的两种方法 第一种,最常用的,通过for in遍历数组 colours = ["red","green","blue"] ...

  3. 在Python中连接字符串的首选方法是什么?

    本文翻译自:Which is the preferred way to concatenate a string in Python? Since Python's string can't be c ...

  4. python3(4)--- python遍历数组的两种方法

    python遍历数组的两种方法 第一种,最常用的,通过for in遍历数组.其实本质就是取出来的是这个数组或者列表中的元素,和角标无关. colours = ["red",&quo ...

  5. python遍历数组的两种方法的代码

    工作过程中,把开发过程中较好的一些内容段备份一下,下面内容是关于python遍历数组的两种方法的内容,希望对小伙伴有用途. colours = ["red","green ...

  6. python使用方法视频-Python读取视频的两种方法(imageio和cv2)

    用python读取视频有两种主要方法,大家可依据自己的需求进行使用. 方法一: 使用imageio库,没有安装的可用pip安装或自己下载,安装好后重启终端即可调用. import pylab impo ...

  7. ML:模型训练/模型评估中常用的两种方法代码实现(留一法一次性切分训练和K折交叉验证训练)

    ML:模型训练/模型评估中常用的两种方法代码实现(留一法一次性切分训练和K折交叉验证训练) 目录 模型训练评估中常用的两种方法代码实现 T1.留一法一次性切分训练 T2.K折交叉验证训 模型训练评估中 ...

  8. JSP中include的两种方法

      一.JSP中include的两种方法 1.include指令: 1 <%@include file="文件的绝对路径或者相对路径"%> file属性是必填的(绝对或 ...

  9. python列表去重的两种方法

    python列表去重的两种方法 1. 使用循环进行遍历,将重复的元素去掉. def test1():lst = [1,2,5,6,3,5,7,3]tmp = []for it in lst:if it ...

最新文章

  1. 爬取了 48048 条评论数据,解读 9.3 分的《毒液》是否值得一看?
  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统(73)-微信公众平台开发-消息管理
  3. 五十八、2020美赛C题的思路以及个人Python的解法
  4. android wheelview 字体颜色,百行代码实现Android WheelView
  5. Markdown语言调整图片居中、大小
  6. IDEA快捷键之搜索查询
  7. MySQL登录时出现的Access denied for user 'root'@'xxx.xxx.xxx.xxx' (using password: YES) 的解决办法
  8. 推荐阅读20100812
  9. ZTE方案ONU PPPoE | FTP | Samba等服务配置分析
  10. 今日的质量,明日的市场--谈谈软件登记测试
  11. 怎样学习人工智能呢?
  12. vant表单checkbox验证问题
  13. html+css网页制作
  14. linux rm-rf误删文件 思路
  15. mybatis-day04-改进多表查询collection配置、延迟加载、缓存、注解开发(★)
  16. “三方演义”与性能优化
  17. MT4/MT5使用dll调用matlab
  18. 达摩院特别版-视觉AI训练营Day1——学习笔记
  19. PyCharm Professional 2016.1 破解 激活
  20. Android-高级-UI-进阶之路(四)-Paint-渲染-滤镜-xfermode-使用

热门文章

  1. 神经网络 - 用单层感知器实现多个神经元的分类 - (Matlab建模)
  2. oracle杀死进程时权限不足_在oracle中创建函数时权限不足
  3. 纠删码存储系统中的投机性部分写技术
  4. 美团内推:java高级开发(一面+二面+三面),面试58题实拍!
  5. java程序员必看经典书单,以及各个阶段学习建议
  6. python 判断一个点(坐标)是否在一个多边形内利用射线法
  7. tensorflow1、2会话、变量、feed、fetch、最小二乘法
  8. 液体火箭发动机技术国家级重点实验室2021年度对外开放项目指南
  9. 2038: [2009国家集训队]小Z的袜子(hose)
  10. Apache网站服务