Python正则表达式的使用范例详解


Posted in Python onAugust 08, 2014

作为一个概念而言,正则表达式对于Python来说并不是独有的。但是,Python中的正则表达式在实际使用过程中还是有一些细小的差别。

本文是一系列关于Python正则表达式文章的其中一部分。在这个系列的第一篇文章中,我们将重点讨论如何使用Python中的正则表达式并突出Python中一些独有的特性。

我们将介绍Python中对字符串进行搜索和查找的一些方法。然后我们讲讨论如何使用分组来处理我们查找到的匹配对象的子项。

我们有兴趣使用的Python中正则表达式的模块通常叫做‘re'。

>>> import re

1. Python中的原始类型字符串

Python编译器用‘\'(反斜杠)来表示字符串常量中的转义字符。

如果反斜杠后面跟着一串编译器能够识别的特殊字符,那么整个转义序列将被替换成对应的特殊字符(例如,‘\n'将被编译器替换成换行符)。

但这给在Python中使用正则表达式带来了一个问题,因为在‘re'模块中也使用反斜杠来转义正则表达式中的特殊字符(比如*和+)。

这两种方式的混合意味着有时候你不得不转义转义字符本身(当特殊字符能同时被Python和正则表达式的编译器识别的时候),但在其他时候你不必这么做(如果特殊字符只能被Python编译器识别)。

与其将我们的心思放在去弄懂到底需要多少个反斜杠,我们可以使用原始字符串来替代。

原始类型字符串可以简单的通过在普通字符串的双引号前面加一个字符‘r'来创建。当一个字符串是原始类型时,Python编译器不会对其尝试做任何的替换。本质上来讲,你在告诉编译器完全不要去干涉你的字符串。

>>> string = 'This is a\nnormal string'
>>> rawString = r'and this is a\nraw string'
>>> print string

这是一个普通字符串

>>> print rawString
and this is a\nraw string

这是一个原始类型字符串。
在Python中使用正则表达式进行查找

‘re'模块提供了几个方法对输入的字符串进行确切的查询。我们将会要讨论的方法有:

re.match()
re.search()
re.findall()

每一个方法都接收一个正则表达式和一个待查找匹配的字符串。让我们更详细的查看这每一个方法从而弄明白他们是如何工作的以及他们各有什么不同。

2. 使用re.match查找 ? 匹配开始

让我们先来看一下match()方法。match()方法的工作方式是只有当被搜索字符串的开头匹配模式的时候它才能查找到匹配对象。

举个例子,对字符串‘dog cat dog'调用mathch()方法,查找模式‘dog'将会匹配:

>>> re.match(r'dog', 'dog cat dog')
<_sre.SRE_Match object at 0xb743e720<
>>> match = re.match(r'dog', 'dog cat dog')
>>> match.group(0)
'dog'

我们稍后将更多的讨论group()方法。现在,我们只需要知道我们用0作为它的参数调用了它,group()方法返回查找到的匹配的模式。

我还暂且略过了返回的SRE_Match对象,我们很快也将会讨论到它。

但是,如果我们对同一个字符串调用math()方法,查找模式‘cat',则不会找到匹配。

>>> re.match(r'cat', 'dog cat dog')
>>>

3. 使用re.search查找 ? 匹配任意位置

search()方法和match()类似,不过search()方法不会限制我们只从字符串的开头查找匹配,因此在我们的示例字符串中查找‘cat'会查找到一个匹配:

search(r'cat', 'dog cat dog')
>>> match.group(0)
'cat'

然而search()方法会在它查找到一个匹配项之后停止继续查找,因此在我们的示例字符串中用searc()方法查找‘dog'只找到其首次出现的位置。

>>> match = re.search(r'dog', 'dog cat dog')
>>> match.group(0)
'dog'

4. 使用 re.findall ? 所有匹配对象

目前为止在Python中我使用的最多的查找方法是findall()方法。当我们调用findall()方法,我们可以非常简单的得到一个所有匹配模式的列表,而不是得到match的对象(我们会在接下来更多的讨论match对象)。对我而言这更加简单。对示例字符串调用findall()方法我们得到:

['dog', 'dog']
>>> re.findall(r'cat', 'dog cat dog')
['cat']

5. 使用 match.start 和 match.end 方法

那么,先前search()和match()方法先前返回给我们的‘match'对象”到底是什么呢?

和只简单的返回字符串的匹配部分不同,search()和match()返回的“匹配对象”,实际上是一个关于匹配子串的包装类。

先前你看到我可以通过调用group()方法得到匹配的子串,(我们将在下一个部分看到,事实上匹配对象在处理分组问题时非常有用),但是匹配对象还包含了更多关于匹配子串的信息。

例如,match对象可以告诉我们匹配的内容在原始字符串中的开始和结束位置:

>>> match = re.search(r'dog', 'dog cat dog')
>>> match.start()
0
>>> match.end()
3

知道这些信息有时候非常有用。

6. 使用 mathch.group 通过数字分组

就像我之前提到的,匹配对象在处理分组时非常得心应手。

分组是对整个正则表达式的特定子串进行定位的能力。我们可以定义一个分组做为整个正则表达式的一部分,然后单独的对这部分对应匹配到的内容定位。

让我们来看一下它是怎么工作的:

>>> contactInfo = 'Doe, John: 555-1212'

我刚才创建的字符串类似一个从某人的地址本里取出来的一个片段。我们可以通过这样一个正则表达式来匹配这一行:

>>> re.search(r'\w+, \w+: \S+', contactInfo)
<_sre.SRE_Match object at 0xb74e1ad8<

通过用圆括号来(字符‘('和‘)')包围正则表达式的特定部分,我们可以对内容进行分组然后对这些子组做单独处理。

>>> match = re.search(r'(\w+), (\w+): (\S+)', contactInfo)

这些分组可以通过用分组对象的group()方法得到。它们可以通过其在正则表达式中从左到右出现的数字顺序来定位(从1开始):

>>> match.group(1)
'Doe'
>>> match.group(2)
'John'
>>> match.group(3)
'555-1212'

组的序数从1开始的原因是因为第0个组被预留来存放所有匹配对象(我们在之前学习match()方法和search()方法到时候看到过)。

>>> match.group(0)
'Doe, John: 555-1212'

7. 使用 match.group 通过别名来分组

有时候,特别是当一个正则表达式有很多分组的时候,通过组的出现次序来定位就会变的不现实。Python还允许你通过下面的语句来指定一个组名:

>>> match = re.search(r'(?P<last>\w+), (?P<first>\w+): (?P<phone>\S+)', contactInfo)

我们还是可以用group()方法获取分组的内容,但这时候我们要用我们所指定的组名而不是之前所使用的组的所在位数。

>>> match.group('last')
'Doe'
>>> match.group('first')
'John'
>>> match.group('phone')
'555-1212'

这大大加强了代码的明确性和可读性。你可以想像当正则表达式变得越来越复杂,去弄懂一个分组到捕获了什么内容将会变得越来越困难。给你的分组命名将明确的告诉了你和你的读者你的意图。

尽管findall()方法不返回分组对象,它也可以使用分组。类似的,findall()方法将返回一个元组的集合,其中每个元组中的第N个元素对应了正则表达式中的第N个分组。

>>> re.findall(r'(\w+), (\w+): (\S+)', contactInfo)
[('Doe', 'John', '555-1212')]

但是,给分组命名并不适用于findall()方法。

在本文中我们介绍了Python中使用正则表达式的一些基础。我们学习了原始字符串类型(还有它能帮你解决的在使用正则表达式中一些头痛的问题)。我们还学习了如何适使用match(), search(), and findall()方法进行基本的查询,以及如何使用分组来处理匹配对象的子组件。

和往常一样,如果想查看更多关于这个主题的内容,re模块的Python官方文档是一个非常好的资源。

在以后的文章中,我们将更深入的讨论Python中正则表达式的应用。我们将更加全面的学习匹配对象,学习如何使用它们在字符串中做替换,甚至使用它们从文本文件中去解析Python数据结构。

Python 相关文章推荐
python格式化字符串实例总结
Sep 28 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
Aug 23 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
Aug 05 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
Apr 21 Python
实例讲解python中的序列化知识点
Oct 08 Python
Python打包方法Pyinstaller的使用
Oct 09 Python
Python 使用Numpy对矩阵进行转置的方法
Jan 28 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
Jul 22 Python
python3.x提取中文的正则表达式示例代码
Jul 23 Python
python3图片文件批量重命名处理
Oct 31 Python
Python基于pandas绘制散点图矩阵代码实例
Jun 04 Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 Python
python脚本实现统计日志文件中的ip访问次数代码分享
Aug 06 #Python
Python写的Socks5协议代理服务器
Aug 06 #Python
Python写的PHPMyAdmin暴力破解工具代码
Aug 06 #Python
Python写的Discuz7.2版faq.php注入漏洞工具
Aug 06 #Python
Python常用列表数据结构小结
Aug 06 #Python
Python生成pdf文件的方法
Aug 04 #Python
Tornado Web服务器多进程启动的2个方法
Aug 04 #Python
You might like
Zerg基本策略
2020/03/14 星际争霸
php使用strtotime和date函数判断日期是否有效代码分享
2013/12/25 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
javascript数据结构之串的概念与用法分析
2017/04/12 Javascript
nginx配置React静态页面的方法教程
2017/11/03 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
2018/05/28 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
[49:17]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第三场 1月26日
2021/03/11 DOTA
python修改注册表终止360进程实例
2014/10/13 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
2019/07/01 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
用Python去除图像的黑色或白色背景实例
2019/12/12 Python
使用python实现多维数据降维操作
2020/02/24 Python
有关打架的检讨书
2014/01/25 职场文书
单位委托书范本
2014/04/04 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
《沉香救母》教学反思
2014/04/19 职场文书
年会主持人开场白台词
2015/05/29 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
趣味运动会广播稿
2015/08/19 职场文书
python通过函数名调用函数的几种方法总结
2021/06/07 Python
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL
详细介绍python操作RabbitMq
2022/04/12 Python