Python正则表达式使用范例分享


Posted in Python onDecember 04, 2016

作为一个概念而言,正则表达式对于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()
>>> match.end()

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

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有点火? 给你7个学习它的理由!
Jun 26 Python
Python中函数及默认参数的定义与调用操作实例分析
Jul 25 Python
Python 25行代码实现的RSA算法详解
Apr 10 Python
详解Python如何生成词云的方法
Jun 01 Python
Python正则表达式匹配数字和小数的方法
Jul 03 Python
python多线程与多进程及其区别详解
Aug 08 Python
使用Pytorch来拟合函数方式
Jan 14 Python
python3 字符串知识点学习笔记
Feb 08 Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 Python
详解python方法之绑定方法与非绑定方法
Aug 17 Python
Django vue前后端分离整合过程解析
Nov 20 Python
使用Python判断一个文件是否被占用的方法教程
Dec 16 Python
Python常用库推荐
Dec 04 #Python
Python 正则表达式的高级用法
Dec 04 #Python
简单谈谈Python流程控制语句
Dec 04 #Python
python中正则的使用指南
Dec 04 #Python
win与linux系统中python requests 安装
Dec 04 #Python
详解Python各大聊天系统的屏蔽脏话功能原理
Dec 01 #Python
python模块简介之有序字典(OrderedDict)
Dec 01 #Python
You might like
星际中的相关伤害
2020/03/04 星际争霸
PHP 表单提交给自己
2008/07/24 PHP
PHP 过滤页面中的BOM(实现代码)
2013/06/29 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
php文件操作相关类实例
2015/06/18 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
jQuery 动态酷效果实现总结
2009/12/27 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
python开发利器之ulipad的使用实践
2017/03/16 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
python range实例用法分享
2020/02/06 Python
python实现录屏功能(亲测好用)
2020/03/02 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
2014年人事专员工作总结
2014/11/19 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
SQL写法--行行比较
2021/08/23 SQL Server
Echarts如何重新渲染实例详解
2022/05/30 Javascript
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS