Python正则表达式分组概念与用法详解

作者:世界看我我看世界 时间:2022-02-12 08:41:25 

本文实例讲述了Python正则表达式分组概念与用法。分享给大家供大家参考,具体如下:

正则表达式分组

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

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

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


>>> s='<div><a href="https://support.google.com/chrome/?p=ui_hotword_search" rel="external nofollow" target="_blank">更多</a><p>dfsl</p></div>'
>>> print re.search(r'<a.*>(.*)</a>',s).group(1)
更多

或者


>>> print re.match(r'.*<a.*>(.*)</a>',s).group(1)
更多

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

命名分组

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


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

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


>>> s = "ip='230.192.168.78',version='1.0.0'"
>>> re.search(r"ip='(?P<ip>\d+\.\d+\.\d+\.\d+).*", s)
>>> res.group('ip')#通过命名分组引用分组
'230.192.168.78'

后向引用

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


#通过命名分组进行后向引用
>>> re.search(r'(?P<name>go)\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)

后向否定断言语法:

(?<!pattern)

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


#提取不是.txt结尾的文件
>>> f1 = 'aaa.txt'
>>> re.findall(r'.*\..*$(?<!txt$)',f1)
[]
#提取不以数字开头的文件
>>> re.findall(r'^(?!\d+).*','1txt.txt')
[]
#提取不以数字开头不以py结尾的文件
>>> re.findall(r'^(?!\d+).+?\..*$(?<!py$)','test.py')
[]
>>> re.findall(r'^(?!\d+).+?\..*$(?<!py$)','test.txt')
['test.txt']

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

JavaScript正则表达式在线测试工具:
http://tools.jb51.net/regex/javascript

正则表达式在线生成工具:
http://tools.jb51.net/regex/create_reg

希望本文所述对大家Python程序设计有所帮助。

标签:Python,正则表达式
0
投稿

猜你喜欢

  • Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法

    2023-03-01 14:24:38
  • python写日志封装类实例

    2022-07-23 22:40:47
  • javascript 日期相减-在线教程(附代码)

    2024-04-18 09:45:00
  • 详解python中docx库的安装过程

    2023-01-21 18:32:36
  • 解析如何在sqlserver代理中配置邮件会话

    2024-01-21 20:55:24
  • Python将视频或者动态图gif逐帧保存为图片的方法

    2022-08-08 00:50:17
  • 在PyCharm中安装PaddlePaddle的方法

    2022-02-24 17:28:18
  • Mysql数据库监听binlog的开启步骤

    2024-01-26 03:50:36
  • Python实战之ATM取款机的实现

    2023-04-23 08:40:25
  • django formset实现数据表的批量操作的示例代码

    2023-10-10 15:20:21
  • 在SQL Server计算机上运行病毒扫描软件

    2009-01-19 14:38:00
  • MySQL数据库备份与恢复方法

    2024-01-18 08:54:10
  • xml文件调用css

    2008-09-05 17:12:00
  • Laravel框架集合用法实例浅析

    2024-05-11 10:03:44
  • laravel学习教程之关联模型

    2023-06-11 19:46:55
  • python 实现视频流下载保存MP4的方法

    2021-09-13 06:31:38
  • python错误处理详解

    2023-04-24 11:10:30
  • Python 获取主机ip与hostname的方法

    2021-05-13 09:30:30
  • 解决Can't locate ExtUtils/MakeMaker.pm in @INC报错

    2024-01-22 20:46:49
  • 解决Pytorch训练过程中loss不下降的问题

    2023-03-01 09:30:22
  • asp之家 网络编程 m.aspxhome.com