前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >这或许是我见过的最简单的正则表达式教程(二)

这或许是我见过的最简单的正则表达式教程(二)

作者头像
石晓文
发布2018-04-11 16:09:09
8340
发布2018-04-11 16:09:09
举报
文章被收录于专栏:小小挖掘机小小挖掘机

五一劳动节来啦,小小挖掘机们小编们首先祝大家劳动节快乐!

作为中国放假大学的一员,除了趁着长达8天的五一春假好好休整之外,当然还要忙中偷闲补习一下python的基本知识,今天想带代大家补习的是python中的正则表达式。不论你是否掌握python中的正则表达式,相信你看了此次教程之后会对它有一个更深入的理解和掌握。

话不多说,直接上代码:

github链接:https://github.com/princewen/professional-python3

第三节:分组

代码语言:javascript
复制
"""
作者:文文
主要介绍正则表达式中的分组概念
python版本:python3.5

"""
import re
"""
python正则表达式提供了一个机制将表达式分组,当使用分组时,除了获得整个匹配,还可以在匹配中选择每一个单独组
可以在正则表达式中使用圆括号指定分组

"""
match = re.search(r'([\d]{3})-([\d]{4})','867-5309 / Jenny')

#返回整个匹配,即867-5309
print (match.group())

#返回一个对应每一个单个分组的元组
#output : ('867', '5309')
print (match.groups())

#获取单个分组,0代表完整的匹配,正式的分组编号从1开始
#output : 867-5309
print (match.group(0))

#output : 867
print (match.group(1))

#output : 5309
print (match.group(2))

"""

命名分组
除了按位置编号的分组外,python正则表达式还提供一个命名分组的机制
一个命名分组的语法是在开始的"("字符后面立即添加 ?P<group_name>
当使用命名分组时,match对象提供了一个groupdict函数,返回一个分组字典,键对应分组的名称
当命名分组和非命名分组同时出现时,非命名分组不会出现在返回的字典中

"""
match = re.search(r'(?P<first_three>[\d]{3})-(?P<last_four>[\d]{4})','867-5309 / Jenny')

#output : 867
print (match.group('first_three'))

#output : {'last_four': '5309', 'first_three': '867'}
print (match.groupdict())

match = re.search(r'(?P<first_three>[\d]{3})-([\d]{4})','867-5309 / Jenny')

#非命名分组不会出现在结果中
#output : {'first_three': '867'}
print (match.groupdict())

"""

引用已经存在的分组
有时候,你或许会寻找同样一个子匹配,该匹配会接下来再次出现
例如,尝试解析一段xml代码,xml代码的开始标记和结束标记必须是相同的,使用<([\w_]+)>和<(/[\w_]+)>并不可行,因为没有限制开始标记必须相同,<boo>和</foo>也可以匹配
正则表达式提供了解决这种问题的一种方式--使用回溯引用
可以使用\M回溯引用编号分组,此时\1表示匹配第一个分组,\2表示匹配第二个分组(最多99个)

"""

#匹配xml
match = re.search(r'<([\w_]+)>stuff</\1>','<foo>stuff</foo>')

#output : <foo>stuff</foo>
print (match.group())

#output : ('foo',) ,此时只有一个分组,因为回溯引用取代了第二个分组
print (match.groups())

#output : None , 因为前后两个标签不一致
print (re.search(r'<([\w_]+)>stuff</\1>','<foo>stuff</boo>'))

第四节:先行断言

代码语言:javascript
复制
"""
作者:文文
正则表达式中的先行断言知识
python版本:python3.5

"""
import re

"""

正则表达式中有一种机制能够基于之后的内容是否存在接受或者拒绝一个匹配,而不需要接下来的内容作为匹配的一部分,它被称为先行断言
取反先行断言:使用(?!字符、字符组或其他基本单元)
正向先行断言: 使用(?=字符、字符组或其他基本单元)

"""
#取反先行断言
#表示n后面不能紧跟e
#仅仅返回字符n
#output : <_sre.SRE_Match object; span=(2, 3), match='n'>
print (re.search(r'n(?!e)','final'))

#output : None
print (re.search(r'n(?!e)','jasmine'))

#output : <_sre.SRE_Match object; span=(5, 6), match='n'>
print (re.search(r'n(?!e)','Python'))

#正向先行断言,表示n后面紧跟e,但返回的匹配结果不包含后面的e
#output : <_sre.SRE_Match object; span=(5, 6), match='n'>
print (re.search(r'n(?=e)','jasmine'))

#output : None
print (re.search(r'n(?=e)','python'))

未完待续。。。

想了解更多? 那就赶紧来关注我们

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-05-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小小挖掘机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档