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

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. sh_04_第1个函数改造

    sh_04_第1个函数改造 name = "小明" # say_hello() # Python 解释器知道下方定义了一个函数 def say_hello(): "&qu ...

  2. scrapy项目4:爬取当当网中机器学习的数据及价格(CrawlSpider类)

    scrapy项目3中已经对网页规律作出解析,这里用crawlspider类对其内容进行爬取: 项目结构与项目3中相同如下图,唯一不同的为book.py文件 crawlspider类的爬虫文件book的 ...

  3. sqli-labs(29)

    0X01 题目说有waf 那我们先来试探一波 ?id=-' union select 1,database(),3%23 成功了 那么他的WAF过滤了什么呐? 这是index.php的源码并没有过滤什 ...

  4. Jar包方式运行web项目

    使用Maven进行打包 在自己的电脑终端中进入到pom.xml文件的目录中执行maven打包.命令为: mvn clean package 1 成功的标志为​上面显示BUILD SUCCESS成功打包 ...

  5. 第五周总结&实验报告三

    第五周总结&实验报告三 实验报告 1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码.结果截图.) ① 统计该字符串中字母s ...

  6. legend3---阿里云如何多个域名指向同一个网站

    legend3---阿里云如何多个域名指向同一个网站 一.总结 一句话总结: 先寻求资料及文档,没有找到的话自己摸索一下就好 结论:多个域名都需要备案 二.阿里云如何多个域名指向同一个网站 当前情况 ...

  7. 一、基础篇--1.1Java基础-面向对象的特征

    面向对象的特征 封装.继承和多态 https://blog.csdn.net/jianyuerensheng/article/details/51602015 封装: 定义:封装就是将数据或函数等集合 ...

  8. 一元回归1_基础(python代码实现)

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...

  9. system系统调用返回值判断命令是否执行成功

    system函数对返回值的处理,涉及3个阶段: 阶段1:创建子进程等准备工作.如果失败,返回-1. 阶段2:调用/bin/sh拉起shell脚本,如果拉起失败或者shell未正常执行结束(参见备注1) ...

  10. PHP操作json

    输出json文件中文处理 <?php $json_array = array(); // 1.转换为json字符串(不自动转换为unicode编码) if (version_compare(PH ...