文档章节

python核心编程-第十五章-个人笔记

好好先生_1028
 好好先生_1028
发布于 2016/05/14 13:42
字数 2061
阅读 60
收藏 8
点赞 2
评论 0

1.正则表达式使用的特殊符号和字符

    1.0  最常见的符号和字符,如下图:

    

   

    这里,反义指的是反义词的意思。如 \w匹配任何数字或者字母, \W 匹配非字母且非数字的字符

    1.1  用"|" 匹配多个正则表达式模式

        "|"即管道符号,表示或的操作,意思是选择被管道符号分隔开的多个表达式中的一个。"或"操作有时也被叫做“联合”,或者“逻辑或”。下面是例子:

        

    1.2  匹配任意一个单个的字符 "."

        "." 匹配除换行符外的任意一个单个字符,无论字母、数字,还是除换行符以外的空白符("\t" "\r"等)、可打印字符、不可打印字符等等,都可匹配。若要匹配 . 本身,则需加一个反斜杠转义。

        

    1.3  从字符串的开头、结尾、单词边界开始匹配 ("^"  "$"  "\b" "\B")

        "^"或者"\A"从字符串开始匹配;"$" 或者"\Z" 从字符串结尾开始匹配。若要匹配这两个字符本身,也需要用转义 "\"

        "\b" 匹配的模式是单词边界,意思是它匹配的正则模式一定在单词(单词可理解为"\w"所能匹配的字符集合)的开头,无论这个单词在一行的起始处还是在字符串中间。"\B"只匹配出现在单词中间的模式(即不在单词的边界)

        

    1.4  方括号"[]"用来匹配某个特定的单字符。使用方括号的正则表达式匹配方括号里的任意一个字符:

 

        对仅有单个字符的正则表达式,方括号和或操作等价,比如我们想匹配"a"、"b"中的一个;但是若我们想匹配"ab"和"cd"中的一个时,则不能选择[abcd],只能选"ab|cd"

        另外,方括号除匹配单个字符外,还支持"-"连接的字符范围,如[A-Z]代表所有大写字母,[a-z]代表小写字母,[0-9]代表十进制数字。若左方块括号之后的第一个字符是"^",则表示不匹配方括号里的任何字符。

 

    1.5  使用闭包操作符实现重复匹配

        "*"号匹配它左边的正则表达式出现0次或0次以上的情况,"+"号匹配它左边的正则式出现1次或更多次的情况,而"?"号匹配它左边的正则式出现0次或1次的情况。对于花括号"{}",花括号里若是单个值,如"{N}",则表示匹配出现N次的情况;若是逗号隔开的一对值,如"{M, N}",则表示匹配出现M次到N次的情况。同样,反斜线转义后则匹配符号本身。

    

2.  正则表达式和python语言

    2.1  re模块的核心函数和方法

    

    2.2  用 match() 匹配字符串

        match() 函数试图从字符串的开始对字符串进行匹配,匹配成功的话返回一个匹配对象,否则返回None。匹配对象的 group() 方法可以用来显示成功的匹配。

        当模式匹配成功时调用匹配对象的 group()  方法会显示成功的匹配

        

       当模式匹配失败时,返回None,此时调用 group() 方法会报错:

        

        if 语句就是为了防止出现 AttributeError 的情形

        另外,即使字符串比正则模式长,也可能匹配成功,只要模式是从字符串的开头开始匹配的:

>>> m = re.match('foo', 'food on the table')
>>> m.group()
'foo'

        也可以省略中间过程,直接返回结果:

>>> re.match('foo', 'food on the table').group()
'foo'

        当匹配不成功时,同样会引发 AttributeError

    2.3  用 search() 搜索字符串

        search() 与march() 工作方式一样,不同之处在于 search() 会搜索(从左至右搜索)字符串中模式首次出现的位置,如果搜索到则匹配成功,返回匹配对象,否则返回None。参看下面的例子。

>>> m = re.match('foo', 'seafood')
>>> if m is not None: m.group()
... 
>>> 
>>> # 无返回结果,说明匹配不成功。但 'foo' 确实在 'seafood'中,此时就是search() 的用处
>>> m = re.search('foo', 'seafood')    # 使用search()
>>> if m is not None: m.group()
...
'foo'

    2.4  运用特殊字符和符号的正则表达式使用案例

        2.4.1  匹配多个字符串(|)

        

        2.4.2  匹配任意单个字符

        

        2.4.3  创建字符集合 []

        下面的例子进一步说明 "|"和"[]"的区别

        

        2.4.4  group() 和groups()

        通过例子来理解 group() 和groups()

        

        如上例,group() 通常用来显示所有匹配,也可用来获取个别匹配的子组。groups()方法则可以获得一个包含所有匹配的子组的元组。下面通过子组的排列组合,更透彻的理解二者。

        

        

        2.4.5  匹配字符串开头、结尾或单词边界

        ^ $ \b 主要用于search()而不是match(),因为match()总是从字符串开头匹配

          

        2.4.6  findall()

        findall()匹配方式类似于search(),不同之处在于前者总是返回一个列表,若没有找到匹配部分返回空列表,找到匹配部分则返回所有匹配部分的列表,从左到右的顺序排列。

        

        2.4.7  subn()和sub()

        sub()和sub()都用于搜索替换,将某字符串中匹配正则表达式模式的部分进行替换,用来替换的部分通常是一个字符串,或者是一个返回字符串的函数。subn()还返回一个表示替换次数的数字,替换后的字符串和表示替换次数的数字作为一个元组的元素返回

        

        2.4.8  split()

        re模块的split()方法类似字符串的split()方法,前者根据正则表达式模式分割字符串,后者根据固定的字符串分割,故前者更灵活。另外,还可以设置一个参数来限制分割的次数。

        若分隔符没有使用由特殊符号组成的正则表达式匹配,那么re.split()和string.split()执行过程是一样的

        

3. 正则表达式示例

    A. 生成用于正则表达式练习的数据       

#!/usr/bin/env python

from random import randint, choice
from string import lowercase
from sys import maxint
from time import ctime

f = open(r"E:\code\Core Python Programming\15\data.txt", 'w')

doms = ('com', 'edu', 'net', 'org', 'gov')
datas = []

for i in range(randint(5, 10)):
    dtint = randint(0, maxint-1)
    dtstr = ctime(dtint)
    
    shorter = randint(4, 7)
    em = ''
    for j in range(shorter):
        em += choice(lowercase)
        
    longer = randint(shorter, 12)
    dn = ''
    for j in range(longer):
        dn += choice(lowercase)
        
    eachline = '%s::%s@%s.%s::%d-%d-%d' % (dtstr, em,
        dn, choice(doms), dtint, shorter, longer)
    datas.append(eachline)    
    print eachline
    
    f.writelines(eachline+'\n')
f.close()

data = datas[randint(0, len(datas)-1)]

    B.匹配、提取时间戳中有关星期的数据。用正则表达式"^Mon|^Tue|^Wed|^Thu|^Fri|^Sat|^Sun",或者只用一个 ^符号,将星期字符串归为一组:"^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) "

    

    这里也可以发现,未分组时 gropu(1) 会报错

    C. 限制更松的情况:匹配以三个数字或者字母组成的字符为开头的字符串:"^\w{3}" 或者 "^(\w{3})",后者是分组的情况

    

    如上,当把匹配模式的{3}写在括号里面时,表示匹配三个连续的、由字母或数字组成的字符,再把这三个字符视为一个组。但如果把{3}挪到括号外面时,含义就变成三个连续的、单个数字或字母的字符。

    D.  通过匹配末尾的三个整型来加深理解match() 和 search(),这里用search()明显更方便。用match则需注意贪婪模式。

    

    如上,在使用 search()搜索时没有问题,在匹配时,即使考虑到分组、考虑到要匹配整行数据,取得的结果仍是不正确,原因就在于正则表达式默认是贪婪模式。贪婪/贪心模式是指,正则表达式中含通配字符时,在从左到右的取值时,会尽量抓取满足匹配的最长字符串。解决办法是用非贪婪操作符 "?",问号放在?、*、+后面,表示要求正则表达式匹配的字符越少越好。

    

用搜索 search()可以只获取中间的那个整型部分:

            

© 著作权归作者所有

共有 人打赏支持
好好先生_1028
粉丝 23
博文 46
码字总数 78986
作品 0
温州
团队拙作《Python机器学习实战》

之前看国内外的 Python 机器学习的书,鲜有将机器学习到底怎么做人脸识别、怎么做风险控制、怎么做 OCR 算法模型列出的,并且真正的一个 Python 应用,不止是从机器学习库中导入一下配置一下...

yijun2018 ⋅ 04/20 ⋅ 0

python资料全集

python: 微信公众号开发小记——2.80端口上的服务 python: 微信公众号开发小记——3.接入三方登录 使用python编写一个壁纸网站的简单爬虫 python: python List 用法 Python 中各个时间复杂度...

d_watson ⋅ 2016/04/15 ⋅ 0

机器学习的最佳学习路线原来只有四步

AI这个词相信大家都非常熟悉,近几年来人工智能圈子格外热闹,光是AlphoGo就让大家对它刮目相看。今天小天就来跟大家唠一唠如何进军人工智能的第一步——机器学习。 在机器学习领域,Python已...

ufv59to8 ⋅ 05/12 ⋅ 0

程序员必备,快速学习 Python 的全套14张思维导图(附高清版下载)

后台回复关键词 思维导图 可获取本文中的高清思维导图(PDF版) ML & AI∣一个有用的公众号 长按,识别二维码,加关注 获取更多精彩文章

micf435p6d221ssdld2 ⋅ 05/23 ⋅ 0

零基础学习机器学习(Python语言、算法、Numpy库、MatplotLib)视频

机器学习作为人工智能的一部分,已经应用于很多领域,远超过人们的想象,垃圾邮件的过滤,在线广告的推荐系统,还有目前发展飞快的物体识别、人脸识别和语音识别的发展,都是机器学习的应用的...

qq_38472149 ⋅ 05/28 ⋅ 0

《Python从小白到大牛》简介

本书是一部系统论述Python编程语言、OOP编程思想以及函数式编程思想的立体化教程(含纸质图书、电子书、教学课件、源代码与视频教程)。为便于读者高效学习,快速掌握Python编程方法。本书作...

tony关东升 ⋅ 05/29 ⋅ 0

Python高级编程和异步IO并发编程

Python高级编程和异步IO并发编程 网盘地址:https://pan.baidu.com/s/1eB-BsUacBRhKxh7qXwndMQ 密码: tgba 备用地址(腾讯微云):https://share.weiyun.com/5Z3x9V0 密码:7cdnb2 针对Pytho...

人气王子333 ⋅ 04/23 ⋅ 0

良心推荐:一份20周学习计算机科学的经验贴(附资源)

雷锋网按:这里是,油管Artificial Intelligence Education专栏,原作者Siraj Raval授权雷锋字幕组编译。 原标题 Computer Science Curriculum 翻译 | 王飞 整理 | 凡江 这是一份五个月(20个...

雷锋字幕组 ⋅ 05/08 ⋅ 0

一个月入门Python爬虫,快速获取大规模数据

数据是创造和决策的原材料,高质量的数据都价值不菲。而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如: 豆瓣、知乎:爬取优质答案,筛选出各话题下热门内容,探索...

Python开发者 ⋅ 04/25 ⋅ 0

这一本书教你用Python快速入门深度神经网络

2016年年初,传奇的围棋棋手李世石与一个围棋界的“新手”开始了一系列举世瞩目的较量。 围棋是一种棋盘类游戏,于2500年前发源于中国。它是一种比国际象棋更为复杂的策略游戏,全球有75个国...

异步社区 ⋅ 06/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 47分钟前 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 7

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部