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

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. jconsole性能监控

    1.进入tomcat bin目录 vim catalina.sh #!/bin/sh下面加入: #!/bin/shJAVA_OPTS="-Dcom.sun.management.jmxrem ...

  2. CentOS7服务器配置

    CentOS7服务器配置 1.更换yum软件源 下载阿里源 cd /etc/yum.repos.d sudo wget -nc http://mirrors.aliyun.com/repo/Cento ...

  3. Docker容器技术入门

    独立容器分开的条件: 1.Namespace命名空间 1.主机名和域名,UTS 2.文件系统,mount 3.进程间通信,IPC 4.独立的进程树PID 5.独立的用户User 6.独立的IP地址tc ...

  4. Mybaits多个参数的传递

    今天介绍是多个参数传递到映射xml,进行CURD操作 一.使用参数映射的方法进行传递 1在接口写对应的方法 public interface EmployeeMapper { public Emplo ...

  5. linux fedora原生的快捷键操作

    显示桌面: ctrl+alt+d 运行终端程序: gnome-terminal : 可以自定义快捷键: ctrl+T 等等.

  6. element 库 date-picker 的 disabledDate 的坑

    概述 今天使用 element 库的 date-picker 组件,使用日期范围,然后使用了 disabledDate 属性,把 2018 年 1 月和 2020 年 12 月之后的日期全部 disa ...

  7. C# App.config 自定义 配置节

    1)App.config <?xml version="1.0" encoding="utf-8" ?><configuration>  ...

  8. Matlab——矩阵运算 矩阵基本变换操作

    矩阵运算 + 加 - 减 .* 乘 ./ 左除 .\ 右除 .^ 次方 .' 转置 除了加减符号,其余的运算符必须加“.” >> a = : a = >> a- %减法 ans ...

  9. c#字符串代码,动态创建编译器

    https://www.cnblogs.com/mrma/p/3998679.html 试了,确实可行,在unity也能用 值得注意的是UnityScript.Scripting.Evaluator ...

  10. 1.parrot os 3.5-----nmap-----katoolin--zenmap

    源:https://www.youtube.com/watch?v=LpM1KooILRc&list=PLBf0hzazHTGOEuhPQSnq-Ej8jRyXxfYvl&index= ...