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

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. UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)

    题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...

  2. [CF11D]A Simple Task 题解

    题解 我们从最简单的思路开始考虑,首先看到题目发现\(n\)非常小,于是很容易想到状态压缩. 我们考虑比较直觉的状态,f[i][j][k]表示以i为起点,当前在j,之前去过的点状态为k的简单环的方案数 ...

  3. 序列式容器————array

    目录 介绍 1 构造函数 2 fill() 3 元素的获取 4 size() 5 empty() 6 front() 7 back() 8 get<n> 9 迭代器(待补充) 10 元素的 ...

  4. 【C++】关键字struct

    网址连接 https://www.cnblogs.com/zhengfa-af/p/8144786.html 主要内容: 1. C语言中,结构体的3中不同声明和定义方式: 2. struct在C和C+ ...

  5. javadoc生成文档

    标签(空格分隔): javadoc java生成html的文档: 要生成注释文档html格式,java里面提供一个工具:javadoc 例如: javadoc -d myhelp -author -v ...

  6. cmake使用2

    CMake支持大写.小写.混合大小写的命令. . 添加头文件目录INCLUDE_DIRECTORIES 语法:include_directories([AFTER|BEFORE] [SYSTEM] d ...

  7. 神经网络学习笔记一——Neural Network

    参考自http://deeplearning.stanford.edu/wiki/index.php/Neural_Networks 神经元模型 h(x)= f(W'x)f(z)一般会用sigmoid ...

  8. Vue知识整理15:组件注册

    采用局部注册组件: 将代码放在vue的一个实例中,而不是单列申明.

  9. String.prototype.replace

    第一个参数是正则表达式 第二个参数是一个replacer 函数的入参如下: replacer(match,p1,p2,p3.. 其实也相当于 replacer($&,$1,$2,$3.. 资料 ...

  10. docker原理(转)

    转自:https://zhuanlan.zhihu.com/p/22382728 https://zhuanlan.zhihu.com/p/22403015 在学习docker的过程中,我发现目前do ...