1.昨日内容回顾

2.正则表达式(re模块是python中和正则表达式相关的模块)

  1.作用

    1)、输入字符串是否符合匹配条件

    2)、从大段文字中匹配出符合条件的内容

  2.字符组

    [0-9a-zA-Z]

  3.元字符(匹配个数1个)

    .   # 匹配除换行符以外的任意字符

    \w   # 匹配字母、数字、下划线

\s   # 匹配空格、回车符(\n)、制表符(\t)

    \d   #匹配数字

    \W   #匹配非字母、数字、下划线

    \S   # 匹配非空格、回车符(\n)、制表符(\t)

    \D   # 匹配非数字

    \n   # 匹配换行符

    \t   # 匹配制表符

    \b   #匹配单词的结尾 例:\bh(以‘h’为开头),h\b(以‘h’为结尾)

    ab|a   #匹配ab或a,注长的放在前边。

    [...]   #匹配字符组中的字符

    [^...]   #匹配除字符组中字符以外的所有字符

    ^   #匹配字符串的开头^a

$   #匹配字符串的结尾a$

       4.量词

    *   #重复0次或更多次

    +   #重复0次或更多次

    ?   # 重复0次或1次

    {n}   # 重复n次

    {n,}   #重复n次或更改次

    {n,m}   #重复n次至m次

    

  5.其他

      1)、  . ^ $ 

正则

待匹配字符

匹配
结果

说明

李[杰莲英二棍子]*

李杰和李莲英和李二棍子

李杰
李莲英
李二棍子

表示匹配"李"字后面[杰莲英二棍子]的字符任意次

李[^和]*

李杰和李莲英和李二棍子

李杰
李莲英
李二棍子

表示匹配一个不是"和"的字符任意次

    2)、  * + ? { }

    3)、  分组 ()与 或 |[][^] #匹配15或18位(含x)例子

ret = re.findall('[1-9]\d{14}(?:\d{2}[0-9x])?$', '34939489495854966234')
        print(ret)

    4)、  转义符 \

        在python中,无论是正则表达式,还是待匹配内容,都是字符串的形式出现,但是字符串中的\也有特殊含义,本身需要转义.所以我们要匹配一次"\d",我们需要写成‘\\d’,

        正则表达式中要写成‘\\\\d’,看着不舒服,写着也不方便,在python中表示待匹配的‘\d’写成r‘\d’,在正则中写成r‘\\d’。

    5)、  贪婪匹配和惰性匹配

贪婪匹配:在满足匹配时,会匹配尽可能长的的字符串,默认采用的是贪婪匹配。

       惰性匹配(?):例子.*?x,取前面任意长的字符串,直至出现x

正则

待匹配字符

匹配
结果

说明

<.*>

<script>...<script>

<script>...<script>

默认为贪婪匹配模式,会匹配尽量长的字符串

<.*?>

r'\d'

<script>
<script>

加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串

3.re模块

    常用方法:

    1.re.findall(‘a’,‘abca’,flag=0)  
  # 返回所有满足匹配条件的结果,放到列表里

    2.re.search(,)        
#函数会在字符串内查找模式匹配,只要找到第一个匹配就会返回包含匹配信息的对象,该对象可以通过.group()方法取回匹配的字符串,如没有匹配返回None。

ret = re.search('a', 'eva egon yuan').group()

      print(ret) #结果 : 'a'

    3.re.match(,)     
#  和search基本相同,不过他仅在待匹配字符串开头匹配

    ret = re.match('ab', 'abcd').group()
    print(ret)

    4.re.split(’[ab]‘,'abcd') 
# 按[ab]的元素进行依次分割,得到列表

      ret = re.split('[ab]','abcd')
      print(ret)
      运行结果:['', '', 'cd']

      正则表达式部分加上()和不加得出结果是不同的,加上()保留了所匹配到的项,而不加()没有保留所匹配到的项目

ret = re.split('(ab)','abcd')
      print(ret)
      '''  ['',
'','ab', 'cd']  '''

    5.re.finditer() 
# 返回一个存放匹配结果的迭代器。

    6.sub subn

7.编译:compile

ret =
re.finditer('\d+','d123dd22ss2343')
print(ret)
print(next(ret).group())
for i in ret:
    print(i.group())
   
'''
<callable_iterator object at 0x000000000075DD30>
123
22
2343
'''

    两个注意点:

    1 findall的优先级查询:#findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ret
= re.findall('www.(baidu|cnblogs).com', 'www.baidu.com,www.cnblogs.com')
print(ret) #
含组 会优先返回组内匹配内容,显示全部匹配内容:
ret = re.findall('www.(?:baidu|cnblogs).com', 'www.baidu.com,www.cnblogs.com')
print(ret)
'''
['baidu', 'cnblogs']
['www.baidu.com', 'www.cnblogs.com']
'''

2 split的优先级查询:加()会会在结果列表中保留匹配的项

      ret=re.split("\d+","eva3egon4yuan") print(ret) #结果 : ['eva', 'egon', 'yuan'] ret=re.split("(\d+)","eva3egon4yuan") print(ret)
#结果
: ['eva', '3', 'egon', '4', 'yuan'] #在匹配部分加上()之      后所切出的结果是不同的, #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项, #这个在某些需要保留匹配部分的使用过程是非常重要的。

3 ?号的4种用法:

     1)、量词:重复0次或一次

     2)、惰性匹配:

3)、分组标识:定义(?P<name> 正则表达式) 使用的时候:(?P=name)

4)、findall和split中:取消分组优先级

4.综合练习和扩展

  1.匹配标签:

    标签匹配的两种方式:

    1)、利用组名:

    ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
    print(ret.group())

    2)、利用组号:

    ret = re.search("<(\w+)>\w+</\\1>","<h1>hello</h1>")
    
print(ret.group())

    3)、练习

    @@@123@@@

    ###123###

'@@@123@@@'

'###123###'

ret = re.search('(?P<tag_name>.+)\w+(?P=tag_name)', '@@123@@@')
print(ret.group())

  2.匹配整数

    

View
Code

  3.数字匹配

# 1、 匹配一段文本中的每行的邮箱
#      
http://blog.csdn.net/make164492212/article/details/51656638
#
# 2、 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’;
ret = re.search('[1-2]\d{3}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2][0-9]|[3][0-1])', '1990-1-1')
print(ret.group())

#
#    分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、
#    一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$
#
# 3、 匹配qq号。(腾讯QQ号从10000开始)  [1,9][0,9]{4,}
#
# 4、 匹配一个浮点数。      
^(-?\d+)(\.\d+)?$   或者  -?\d+\.?\d*
#
# 5、 匹配汉字。            
^[\u4e00-\u9fa5]{0,}$
ret = re.findall('^[\u4e00-\u9fa5]','中国人民共和国ss')
print(ret)
#
# 6、 匹配出所有整数

  4.爬虫练习

  5.作业题,计算器

  实现能计算类似

  1 - 2 *
( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/
(16-3*2) )等类似公式的计算器程序

5.collections模块:

1、namedtuple # 生成可以用名字来访问的元素内容的元组(不能改)
  2、deque  # 双端队列 可以快速的从另一侧追加和删除元素
  3、OrderedDict #
有序字典
  4、defaultdict #
带默认值的字典
  5、Counter    # 计数器 主要用来计数。

python全栈开发day16-正则表达式和re模块的更多相关文章

  1. python全栈开发之正则表达式和python的re模块

    正则表达式和python的re模块 python全栈开发,正则表达式,re模块 一 正则表达式 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的 ...

  2. python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)

    一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...

  3. python 全栈开发,Day28(复习,os模块,导入模块import和from)

    一.复习 collections 增加了一些扩展数据类型 :namedtuple orderdict defaltdict队列和栈time 时间 三种格式 : 时间戳 结构化 字符串random 随机 ...

  4. python全栈开发_day15_函数回调和模块

    一:函数回调 def a(fn=None): print("run1") if fn: fn() print("run 2") def b(): print(& ...

  5. python全栈开发学习_内容目录及链接

    python全栈开发学习_day1_计算机五大组成部分及操作系统 python全栈开发学习_day2_语言种类及变量 python全栈开发_day3_数据类型,输入输出及运算符 python全栈开发_ ...

  6. python全栈开发中级班全程笔记(第二模块、第四章(三、re 正则表达式))

    python全栈开发笔记第二模块   第四章 :常用模块(第三部分) 一.正则表达式的作用与方法 正则表达式是什么呢?一个问题带来正则表达式的重要性和作用      有一个需求 : 从文件中读取所有联 ...

  7. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  8. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  9. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  10. Python全栈开发【基础四】

    Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...

随机推荐

  1. 动态生成js数据Response.Expires=1440竟然无效?

    项目当中有一些数据,比如多语言翻译,要求做语言包,起初当然是做成i18n.js文件,但是每个阶段版本更新都会增加一些key,那么发布的时候只能给<script>的src增加?2018091 ...

  2. qemu基本使用

    1.qemu的安装 请参考家用路由器0day漏洞挖掘技术这本书 2.基本使用 qemu有主要如下两种运作模式: 用户模式(User Mode),亦称使用者模式.qemu能启动那些为不同中央处理器编译的 ...

  3. C# 使用ffmpeg视频截图

    <appSettings> <add key="ffmpeg" value="E:\ffmpeg\ffmpeg-20141012-git-20df026 ...

  4. python 新式类的 __getattribute__

    这个方法定义在object中,所以所有的新式类都继承有该方法,所有的新式类的实例在获取属性value的时候都会调用该方法,为了验证这一结论,我们重写一下该方法: class C(object): a ...

  5. Udacity并行计算课程 CS344 编程作业答案

    Problem set 1 // Homework 1 // Color to Greyscale Conversion //A common way to represent color image ...

  6. 使用PowerMockito和Mockito进行模拟测试,包括静态方法测试,私有方法测试等,以及方法执行的坑或者模拟不成功解决

    依赖:这个很重要,不同版本用法也有点区别: <dependency> <groupId>org.mockito</groupId> <artifactId&g ...

  7. python3数据结构与算法

    python内置的数据结构包括:列表(list).集合(set).字典(dictionary),一般情况下我们可以直接使用这些数据结构,但通常我们还需要考虑比如搜索.排序.排列以及赛选等一些常见的问题 ...

  8. UML和模式应用5:细化阶段(6)---操作契约

    1.前言 操作契约使用前置和后置条件,描述领域模型里对象的详细变化,作为系统操作的结果. 操作契约可以作为有用的OOA相关的制品. 操作契约可以视为UP用例模型的一部分,它是对用例之处的系统操作的效用 ...

  9. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(2)- 寄存器

    1. 前言 2. 指令运行与异常处理寄存器 ARM体系结构的寄存器分为两类: (1)系统控制和状态报告寄存器 (2)指令处理寄存器,如累加.异常处理 本部分将主要介绍如上第(2)部分的寄存器,分为AA ...

  10. Kernel 3.0.8 内存管理函数【转】

    转自:http://blog.csdn.net/myarrow/article/details/7208777 1. 内存分配函数 相关代码如下: #define alloc_pages(gfp_ma ...