简单认识正则表达式

正则测试工具:http://tool.chinaz.com/regex/

元字符,单个字符匹配

    .         匹配除换行符以外的任意字符
\w 匹配字母数字下划线(word)
\s 匹配任意空白符 (space)
\d 匹配数字 (digit) 大写则为非
\W 非字母数字下划线 [\W\w] [\S\s] [\D\d] 可匹配全局
\S 非空白
\D 非数字 \n 匹配换行符
\t 匹配制表符 \b 匹配结尾 hello\b ^ 匹配开头
$ 匹配结尾 a|b a或者b
[^..] 除去哪些不匹配 量词的使用 * 匹配0次或多次
+ 匹配1次或多次
? 匹配0次或1次
{n} 匹配n次
{n,} 匹配n次或更多次
{n,m} 匹配n到m次
在量词后面加?为惰性匹配 分组:
() 需要将几个约束集中在一起约束

re模块常用方法

import re
# findall
# search
# match
ret = re.findall('[a-d]','hello world') # 前面放匹配规则,后面放匹配字符串
print(ret) ret = re.search('a','abc bca') # 只匹配到第一个后就返回,调用group()方法得到结果。
if ret: print(ret.group()) # 匹配不到返回None,调用group() 会报错 ret = re.match('ev','eva egon yuan')
if ret: print(ret.group()) # 只从整串字符串开头匹配,中间的匹配不到。同样需要group()方法

# split
ret = re.split('[ab]','abcd') # 先按a分割,再按b分割 ['','bcd']
print(ret) ['', '', 'cd'] # sub
ret = re.sub('\d','H','ads4vdef3vve2',1) # 将数字替换成 H,1 表示 只替换1处
print(ret)
ret = re.subn('\d','H','ads4vdef3vve2') # 将数字替换成 H,返回元祖以及替换次数
print(ret) # compile
obj = re.compile('\d{3}')
# 将正则表达式编译成一个 正则表达式对象。
ret = obj.search('abc123eee')
print(ret.group()) # finditer
ret = re.finditer('\d','sa2dv3vf4btf5bg678')  # finditer() 返回一个迭代器,同样需要用group()方法
print(ret) # <callable_iterator object at 0x000001BABCB10208>  
for i in ret:
print(i.group())

python中需要注意的两个特殊优先级情况

1.findall() 优先级

import re

ret = re.findall('www.(baidu|oldboy).com','www.baidu.com')
print(ret)
# ['baidu'] findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消分组优先 ret = re.findall('www.(?:baidu|oldboy).com','www.baidu.com')
print(ret)
# ['www.baidu.com']

2.split() 优先级

import re

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

计算器作业

a = 1 - 2 * (( 60 - 30 + (-40/5) * (9 - 2*5/3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568/14)) - (-4*3) / (16-3*2))
print(a)

综合联系与扩展

1.匹配标签

import re
ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
#还可以在分组中利用?<name>的形式给分组起名字
#获取的匹配结果可以直接用group('名字')拿到对应的值
print(ret.group('tag_name')) #结果 :h1
print(ret.group()) #结果 :<h1>hello</h1> ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
#如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致
#获取的匹配结果可以直接用group(序号)拿到对应的值
print(ret.group(1))
print(ret.group()) #结果 :<h1>hello</h1>

2.匹配整数

import re

ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '-2', '60', '', '5', '-4', '3']
ret.remove("")
print(ret) #['1', '-2', '60', '5', '-4', '3']

day18常用模块之re模块的更多相关文章

  1. python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

    1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...

  2. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块

    正则表达式   语法:             mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ...

  3. os常用模块,json,pickle,shelve模块,正则表达式(实现运算符分离),logging模块,配置模块,路径叠加,哈希算法

    一.os常用模块 显示当前工作目录 print(os.getcwd()) 返回上一层目录 os.chdir("..") 创建文件包 os.makedirs('python2/bin ...

  4. (常用)configparser,hashlib,hamc模块

    configparser模块 #专门解析my.ini这种形式的文件(cnf) import configparser  config=configparser.ConfigParser()  conf ...

  5. python 常用模块(一): os模块,序列化模块(json模块 pickle模块 )

    1.os模块 2.序列化模块:(1)json模块 和 pickle模块 一.os模块 os.path.abspath: (1)把路径中不符合规范的/改成操作系统默认的格式 import os path ...

  6. Python常用内置模块之xml模块

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示 ...

  7. python常用模块之时间模块

    python常用模块之时间模块 python全栈开发时间模块 上次的博客link:http://futuretechx.com/python-collections/ 接着上次的继续学习: 时间模块 ...

  8. python的常用模块之collections模块

    python的常用模块之collections模块 python全栈开发,模块,collections 认识模块 什么是模块?    常见的场景:一个模块就是一个包含了python定义和声明的文件,文 ...

  9. python常用模块-调用系统命令模块(subprocess)

    python常用模块-调用系统命令模块(subprocess) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. subproces基本上就是为了取代os.system和os.spaw ...

  10. 常用模块:os模块,logging模块等

    一    os模块 那么作为一个常用模块,os模块是与操作系统交互的一个模块. 那么os模块中我们常用的一般有以下几种: os.listdir('dirname') 以列表的形式列出指定目录下的所有文 ...

随机推荐

  1. windows下使用hbase/opencv/ffmpeg小记

    1.hadoop安装 不同于Ubuntu,win 10下使用hbase需安装hadoop环境,这里有几个坑,首先14年以后,hadoop已不再发布window版本,这里可往官网 http://hado ...

  2. [BZOJ 4516] [SDOI 2016] 生成魔咒

    Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例 ...

  3. edusoho -A5: AppBundle UML

    edusoho -A5:  AppBundle UML

  4. 「CF1154F」Shovels Shop【背包DP】

    题目链接 [洛谷传送门] 题解 非常简单的背包. \(f[i]\)表示购买\(i\)个物品所需要最少的花费. 不考虑免费的限制条件,那么一定是选择前\(k\)个双鞋子. 那么加入免费的条件,那么还是要 ...

  5. A.01.12—模块的输出—通讯(CAN&LIN)

    AN和LIN相关的内容很多,今天仅对几年前困扰过我的一个疑问进行说明. 以前最常见的通迅方式为CAN和LIN,但现在也有很多其他的通讯方式了,而这两种通讯方式仍使用广泛. 前几年常听人说CAN的成本和 ...

  6. 洛谷 P1411 树

    最近在做些树形DP练练手 原题链接 大意就是给你一棵树,你可以断开任意数量的边,使得剩下的联通块大小乘积最大. 样例 8 1 2 1 3 2 4 2 5 3 6 3 7 6 8 输出 18 我首先想的 ...

  7. 二、java基本语法

    一.标识符 java对各种变量.方法和类等要素命名时使用的字符序列成为标识符:通俗点,凡是自己可以起名字的地方都叫标识符,都遵守标识符的规则 1.标识符命名规则: 1)标识符由字符.下划线.美元符或数 ...

  8. 条件随机场(CRF)

    从宏观上讲,条件随机场就是给出一个序列 X = (x1, x2 ... xn) 得到 另一个序列 Y = (y1 , y2 ... yn). 这两个序列有着一些独特的特性,满足马尔可夫随机场,我理解的 ...

  9. 2017-12-19python全栈9期第四天第二节之列表的增删查改之正向排序和倒向排序和反转

    #!/user/bin/python# -*- coding:utf-8 -*-li = [3,5,6546,6,8,324,2,1,34,5,6,7]# li.sort() #正向# print(l ...

  10. 金融量化分析【day110】:NumPy通用函数

    一.通用函数 能同时对数组中所有元素进行运算的函数 1.一元函数 1.sqrt 2.ceil 3.modf 4.isnan 5.abs 2.二元函数 1.maxinum 二.数学和统计方法 1.sum ...