第七章   模式匹配和正则表达式

1.不用正则表达式来查找文本模式

#对于这样的一个文本查找:3个数字,一个短横线,3个数字,4个端横线,然后再是4个数字,如:415-555-4242
def isPhoneNumber(text):
if len(text)!=:
return False
for i in range(,):
if not text[i].isdecimal():
return False
if text[]!='-':
return False
for i in range(,):
if not text[i].isdecimal():
return False
if text[]!='-':
return False
for i in range(,):
if not text[i].isdecimal():
return False
return True
print(isPhoneNumber('444-555-6767')) 这个地方isPhoneNumber()函数对代码进行几行的检查,首先检查字符串是不是刚好12个字符,然后检查前3个字符,

2.用正则表达式查找文本模式

  (1)正则表达式,简称为regex,是文本模式的描述方法。如\d是一个正则表达式,表示的是一位数字的字符,即任何0-9之间的数字。python使用正则表达式\d\d\d-\d\d\d-\d\d\d\d,来匹配isPhoneNumber()函数匹配同样的文本:3个数字 、1个横线、3个数字、一个短横线、4个数字。所有的其他字符串都不能匹配\d\d\d-\d\d\d-\d\d\d\d的正则表达式

  在一个模式的后面加上一个花括号包围的3({3}),也就是匹配这个模式3次。所以正则表达式\d{3}-\d{3}-\d{4}也在匹配正确的电话号码匹配格式

  (2)python中所有的正则表达式的函数都在re模块中。在交互式环境中,导入该模块

import re
在本章的后面大多数的例子都需要用到re模块,所以要记得在每个脚本开始的地方导入它

   向re.compile()传入一个字符串的值,表示正则表达式,将会返回Regix模式对象

  在交互环境中创建一个Regix对象来匹配电话号码模式,在交互环境中的代码如下:

phoneNumRegix=re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')

  (3)匹配Regix对象

>>> import re
>>> phoneNumRegix=re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
>>> mo=phoneNumRegix.search('My number is 415-555-4343.')
>>> print('Phone number found:'+mo.group())
Phone number found:--

  regix对象search方法查找传入的字符串,寻找正则表达式所有的匹配。如果字符串中没有找到该正则表达式的表达式模式,searchI()方法将会返回None。如果找到了该模式,search()方法将会返回一个Match对象。Match对象有一个group()方法,它返回被查找字符串中实际匹配的文本

  这里现将期待的模式传递给re.complie(),并得到Regix对象保存在phoneNumRegix中。然后我们在phoneNumRegix上调用search(),向其传入向查找的字符串,将查找的结果保存在mo中

  (4)正则表达式的复习

    用import re 导入正则表达式模块

    用re.compile()函数创建一个Regix对象

    向Regix对象的search()方法传入想要查找的字符串,返回实际匹配的文本字符串

    调用Match对象的group()方法,返回实际匹配文本的字符串

  (5)用正则表达式匹配更多的模式

    利用括号进行分组。假设要将区号从电话号码中分离。添加括号在正则表达式中创建'分组:'(\d\d\d)-(\d\d\d-\d\d\d\d)。然后可以用group()匹配对象的方法,从一个分组中获取匹配的文本。在正则表达式字符串中,第一个括号就是第一组,第二个括号就是第二组。向group()匹配对象传入整数1或者整数2,就可以取得匹配文本的不同的部分。向group()方法传入0或者不传入参数,将返回整个匹配的文本。

>>> phoneNumRegix=re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
>>> mo=phoneNumRegix.search('My number is 415-555-4242')
>>> mo.group()
''
>>> mo.group()
'555-4242'
>>> mo.group()
'555-4242'
>>> mo.group()
'415-555-4242' #如果想一次就获取所有的分组,可以使用groups()方法
>>> mo.groups()

('415', '555-4242')
>>> areaCode,mainNumber=mo.groups()
>>> print(areaCode)
415
>>> print(mainNumber)
555-4242

  这个地方可以发现,mo.groups()返回的是多个值的元组,所以可以使用多重复制的技巧,每个值赋给一个变量

  (7)用管道来匹配多个分组

  字符|称之为"管道"。希望匹配许多表达式中的一个的时候,就可以使用这个。例如:正则表达式r'Batman|Tina Fey'将会匹配'Batman'或者'Tina Fey'。如果Batman和Tina Fey都出现在被查找的字符串中,第一次次出现的Match对象返回。

>>> heroRegex=re.compile(r'Batman|Tina Fey')
>>> mo1=heroRegix.search('Batman and Tina Fey.')
Traceback (most recent call last):
File "<stdin>", line , in <module>
NameError: name 'heroRegix' is not defined
>>> mo1=heroRegex.search('Batman and Tina Fey.')
>>> mo1.group()
'Batman'
>>> mo2=heroRegex.search('Tina Fey and Batman.')
>>> mo2.group()
'Tina Fey'

  利用findall()方法,可以找到所有匹配的地方。也可以使用管道来匹配多个模式中的一个,作为正则表达式的一部分。例如:假设你希望匹配'Batman'、'Batmobile','Batcopter'和'Batbat'中的任意一个。因为所有这些字符串都以Bat开始,所以如果能够指定一次前缀,就会很方便,可以通过括号实现。

>>> batRegex=re.compile(r'Bat(man|mobile|copter|bat)')
>>> mo=batRegex.search('Batmobile lost a wheel')
>>> mo.group()
'Batmobile'
>>> mo.group()
'mobile'
>>>

  方法调用mo.group()返回了完全匹配的文本'Batmobile',而mo.group(1)只是返回第一个括号分组内匹配的文本'mobile'。通过管道分组和分组括号

python学习笔记(5)的更多相关文章

  1. python学习笔记整理——字典

    python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...

  2. VS2013中Python学习笔记[Django Web的第一个网页]

    前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ...

  3. python学习笔记之module && package

    个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, ...

  4. python学习笔记(六)文件夹遍历,异常处理

    python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...

  5. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  6. python学习笔记--Django入门0 安装dangjo

    经过这几天的折腾,经历了Django的各种报错,翻译的内容虽然不错,但是与实际的版本有差别,会出现各种奇葩的错误.现在终于找到了解决方法:查看英文原版内容:http://djangobook.com/ ...

  7. python学习笔记(一)元组,序列,字典

    python学习笔记(一)元组,序列,字典

  8. Pythoner | 你像从前一样的Python学习笔记

    Pythoner | 你像从前一样的Python学习笔记 Pythoner

  9. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  10. python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹

    python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...

随机推荐

  1. GIL与event事件讲解

    一.GIL全局解释器锁 global interpreter lock 1.GIL是一个互斥锁:保证数据的安全(以牺牲效率来换取数据的安全),阻止同一个进程内多个线程同时执行(不能并行但是能够实现并发 ...

  2. 【转】django rest framework ModelSerializer 、serializers小结

    转自:https://blog.csdn.net/l_vip/article/details/79156113 引言 serializers是什么?官网是这样的”Serializers allow c ...

  3. vue 使用 vue-awesome-swiper (基础版)

    1.0 安装 vue-awesome-swiper(稳定版本 2.6.7) npm install vue-awesome-swiper@2.6.7 --save 2.0 引入配置(全局使用) 2.1 ...

  4. QT 信号槽 异步事件驱动 单线程 多并发

    利用好Qt 模块的异步信号槽,单线程同样可是实现很强悍的的并发能力.应付正常的功能是足够的. 需要注意的是:该模式本质上为 单线程 事件驱动异步模式,所以需要做的事优化你的业务代码构架以应付性能与并发 ...

  5. python3学习笔记(二):Python初识

    一.算法 在开始认真地编程之前,首先来解释下什么是计算机程序设计.简单地说,它就是告诉计算机要做什么.计算机可以做很多事情,但是它不会自己思考,需要我们告诉它具体细节,并且使用计算机能够理解的语言把算 ...

  6. WebView:是应用程序打开web网页的UI控件后端

    public class WebViewActivity extends Activity { private WebView webView; @Override protected void on ...

  7. ZXing使用详解与范例(C#)

    介绍 ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码.(引自百度百科) 用 ...

  8. MATLAB之图像分块处理

    file_path = 'D:/MATLAB/bin/IMAGES/GreenChannels/_512_pixel/';% 图像文件夹路径 img_path_list = dir(strcat(fi ...

  9. 惠普DL360G6安装ESXi主机后设置多块网卡

    需要先把服务器的网线连接到路由器 然后打开esxi设置网络的netwoork adapters 选中多块网卡,点确定保持 然后在到esxi客户端操作: 直接下一步 这里填上路由器分配的网段ip即可了

  10. hibernate缓存机制与N+1问题

    在项目中遇到的趣事 本文基于hibernate缓存机制与N+1问题展开思考, 先介绍何为N+1问题 再hibernate中用list()获得对象: /** * 此时会发出一条sql,将30个学生全部查 ...