Python正则表达式教程之二:捕获篇
作者:一根笨茄子 发布时间:2023-08-24 00:27:39
标签:python,正则表达式,捕获
前言
在上一篇文中,我们介绍了关于Python正则表达式的基础,那么在这一篇文章里,我们将总结一下正则表达式关于捕获的用法。下面话不多说,来看看详细的介绍吧。
捕获
捕获和分组在正则表达式中有着密切的联系,一般情况下,分组即捕获,都用小括号完成(因此,小括号在正则表达式中也属于特殊字符,表达原含义时需要转义):
(…) 正常分组,并捕获
(?:…) 分组,但是不捕获
举个例子,假设我们需要匹配一个座机号码:
>>> m = re.search(r'^(\d{3,4}-)?(\d{7,8})$','020-82228888')
>>> m.group(0)
'020-82228888'
>>> m.group(1)
'020-'
>>> m.group(2)
'82228888'
这里,默认分组(0)是完整的匹配,之后的分组则按出现顺序排列。
接下来,我们想在一整段文本中,找出所有的座机号码,这里需要用到re.findall
:
>>> re.findall(r'(\d{3,4}-)?(\d{7,8})','020-82228888\n0357-4227865')
[('020-', '82228888'), ('0357-', '4227865')]
findall有一个特性,就是如果结果中有捕获的分组,则将捕获的分组组成tuple返回。利用这个特点,和上面提到的分组,但是不捕获的语法,可以得到我们想要的结果:
>>> re.findall(r'(?:\d{3,4}-)?\d{7,8}','020-82228888\n0357-4227865')
['020-82228888', '0357-4227865']
>>> re.findall(r'(?:\d{3,4}-)?\d{7,8}','020-82228888\n4227865')
['020-82228888', '4227865']
在正则表达式中,也可以通过\1,\2等来指代之前捕获的字符串组合。这个经常用于单双引号的正确匹配:
>>> sentence = """You said "why?" and I say "I don't know"."""
>>> re.findall(r'["\'](.*?)["\']', sentence)
['why?', 'I don']
>>> re.findall(r'(["\'])(.*?)\1', sentence)
[('"', 'why?'), ('"', "I don't know")]
此外,如果觉得\1,\2这种表示可读性不好的话,还可以给捕获起一个英文名字。如下例子中,实现了两种不同的日期格式之间的转换:
>>> sentence = "from 12/22/1629 to 11/14/1643"
>>> re.sub(r'(?P<month>\d{2})/(?P<day>\d{2})/(?P<year>\d{4})', r'\g<year>-\g<month>-\g<day>', sentence)
'from 1629-12-22 to 1643-11-14'
但是,这种命名引用捕获的方式,在findall、search中却是无效的:
>>> sentence = """You said "why?" and I say "I don't know"."""
>>> re.findall(r'(?P<quote>["\'])(.*?)\g<quote>', sentence)
[]
>>> re.search(r'(?P<quote>["\'])(.*?)\g<quote>', sentence)
>>> re.search(r'(?P<quote>["\'])(.*?)\1', sentence)
<_sre.SRE_Match object; span=(9, 15), match='"why?"'>
>>> re.search(r'(?P<quote>["\'])(.*?)\1', sentence).groupdict()
{'quote': '"'}
来源:http://blog.guoyb.com/2017/02/27/python-regex-2/
0
投稿
猜你喜欢
- 在项目中遇到按下Backspace键让浏览器后退的问题,上网搜了几种解决方案都不太理想。于是集众人之智,采众家之长,归纳如下:1、在公用js
- 废话还是说太多了 直接上代码import randomimport sys# 牌面列表card_code = ['A', &
- 为了今天要写的内容,运行了将近7个小时的程序,在数据库中存储了1千万条数据。——今天要说的是mysql数据库的IF()函数的一个实例。 具体
- 1.在python中excel的简单读写操作,推荐使用xlrd(特别是读操作) 2.到http://pypi.python.org/pypi
- 回顾上一篇文章我们介绍了切片slice的定义初始化、引用类型特征、如何使用数组切割成切片。这篇文章介绍切片的生成make()、切片的追加ap
- 本文实例讲述了Python数组定义方法。分享给大家供大家参考,具体如下:Python中没有数组的数据结构,但列表很像数组,如:a=[0,1,
- 一、python线程的模块1.thread和threading模块thread模块提供了基本的线程和锁的支持threading提供了更高级别
- 安装SQL Server2016正式版今天终于有时间安装SQL Server2016正式版,下载那个安装包都用了一个星期安装包可以从这里下载
- 本文实例讲述了php中Array2xml类实现数组转化成XML的方法。分享给大家供大家参考。具体实现方法如下:<?phpclass A
- 本文实例讲述了Python判断文本中消息重复次数的方法。分享给大家供大家参考,具体如下:#coding:gbk'''
- 变量名1、组成:数字、字母、下划线2、变量名要有意义3、多个单词则用下划线,如user_id4、python的变量名不要驼峰显示字符串:1、
- [sql] -- ===================【创建存储过程】===================== USE [Message
- 一、求解方法、算法和编程方案线性规划 (Linear Programming,LP) 是很多数模培训讲的第一个算法,算法很简单,思想很深刻。
- 本文以sql2012为例第一步,(查询日志中文件名和大小):USE 数据库名GOSELECT file_id, name,size,* FR
- turtle.pencolor(* args )返回或设置pencolor。允许四种输入格式:pencolor()将当前的pencolor返
- jieba 库是优秀的中文分词第三方库,中文文本需要通过分词获得单个的词语1、jieba库安装管理员身份运行cmd窗口输入命令:pip in
- tkinter提供了三个模块,可以创建弹出对话窗口:(使用必须单独导入模块)1.messagebox消息对话框示例:askokcanceli
- 一、变量声明变量go定义变量的方式和c,c++,java语法不一样,如下:var 变量名 类型, 比如 : var a intvar在前,变
- 我使用“ Web 2.0设计”来形容目前占主导优势的网页设计风格, 很多人用这个词来形容:网络经济的复苏网站和用户之间更高水平的交互或一种社
- 概述python开发过程中,我们可能需要同时开发多款应用,这些应用可能公用同一个版本的Python程序,但是使用不同版本的第三方库,比如A应