第二十五天 正则表达式
文章目录
- 正则表达式
- 1.为什么使⽤正则表达式
- 2.正则表达式的组成
- 3.正则常⽤⽅法
- 4.应⽤实例
- 5.练习
- ⼀、⾼阶函数
- 1 map
- 2 reduce
- 3 filter
- 4 sorted
- ⼆、深拷⻉和浅拷⻉
正则表达式
正则表达式是对字符串操作的⼀种逻辑公式,就是⽤事先定义好的⼀些特定字符、及这些特定字符的组合,组成⼀个“规则字符串”,这个“规则字符串”⽤来表达对字符串的⼀种过滤逻辑。
- 需要引⼊内置模块re
- 缺点:效率低下,能⽤字符串⽅法完成尽量使⽤字符串的⽅法
- 优点:编码简单
1.为什么使⽤正则表达式
- 使⽤场景
- 敏感词过滤
- ⼿机、邮箱等验证
- 爬⾍
2.正则表达式的组成
- 原⼦ 组成正则表达式的最⼩单位,任何字符都可以
原子 | 含义 | 原子 | 含义 |
---|---|---|---|
\d | 0-9中任何⼀个字符 [0-9] | \w | 0-9a-zA-Z的中任何⼀个字符 [0-9a-zA-Z] |
\D | ⾮0-9中的任何⼀个字符[^0-9] | \W | ⾮0-9a-zA-Z_的中任何⼀个字符[^0-9a-zA_Z] |
\s | \n\r\t 空格 | . | 代表除\n之外的任何字符 |
\S | ⾮\n\r\t 空格中任何⼀个字符[^\n\t\r ] | \b | 词边界 |
[] | ⾃⼰创建的原⼦表,[0-4]代表0-4中任何⼀个字符 | \B | ⾮词边界 |
[^] | 排除原⼦表中的字符 | \A | 字符串开始 |
^ | ⾏⾸;在原⼦表中表示排除 | \Z | 字符串的结尾 |
$ | ⾏结尾 | - | 表示域,0-9就表示0到9所有数字字符 |
[\u4e00-\u9fa5] | 匹配纯中⽂ |
- 量词 量词能够增强原⼦的描述能⼒
量词 | 含义 | 量词 | 含义 |
---|---|---|---|
{} | 表示重复前⼀个原⼦的次数 | * | 重复0次或多次{0,} |
{m} | 表示重复前⼀个原⼦的m次 | + | ⾄少出现1次{1,} |
{m,n} | 表示重复前⼀个原⼦的最少m次,最多n次 | ? | 出现0次或1次{0,1} |
{m,} | 表示重复前⼀个原⼦的最少m次 | *?,+? | 取消贪婪 |
() | 改变优先级,取⼦元素 | x|y | 表示匹配x或者y |
- 模式修正符
修饰符 | 含义 | 修饰符 | 含义 |
---|---|---|---|
re.S | 使.匹配所有字符 | re.I | 不区分⼤⼩写 |
re.L | 本地化识别 | re.M | 多⾏匹配 |
re.U | 根据Unicode字符集解析字符,会影响\b、\B、\w、\W |
注意:
- 模式字符串⼀定要使⽤原⽣字符串,也就是⽤r开头的字符串。r’www’
- 严格区分⼤⼩写
- 如果正则表达式中有{,},[,],-,?,*,|^,$,.等做普通字符,则要将其转义
3.正则常⽤⽅法
- re.match()
原型:re.match(pattern,string,flags=0)
功能:从字符串起始位置匹配⼀个模式,如果不是从起始位置匹配则返回None
参数:patter 模式string 要匹配的字符串flag 模式修正符
返回值: 匹配成功返回⼀个Match object,失败返回Noneprint(re.match(r'www','www.baidu.com'))
print(re.match(r'www','http:///www.baidu.com')) #None
print(re.match(r'www','cctv.www.baidu.com')) #None
ret = re.search(r'(abc)+', 'xxxabcabcabcdef')
print(ret.group(0)) # abcabcabc 匹配整个表达式
print(ret.group(1)) # abc 第⼀次匹配到的结果
print(ret.span()) # (3, 12) 开始和结束位置
print(ret.groups()) # 表示当正则表达式⾥有多个分组时,多个分组的匹配
结果
- re.search()
原型:re.search(pattern, string, flags=0)
功能:顺序扫描字符串,找到第.个匹配项结束
参数:patter 模式string 要匹配的字符串flag 模式修正符
返回值:匹配成功,返回match object,否则返回Noneprint(re.search(r'll','hello'))
print(re.search(r'll','heLLo',re.I))
- re.findall()
原型:findall(pattern, string, flags=0)
功能:扫描整个字符串,并返回结果列表
参数:patter: 匹配的正则表达式string: 要匹配的字符串flags:模式修正符
返回值:如果匹配成功返回⼀个列表,包含了所有匹配项,失败返回空列表
print(re.findall(r'oo','kksdkoosdflsdfooksdfsdoOppppweOo',re.I))
#['oo', 'oo', 'oO', 'Oo']
- re.split
原型:split(pattern, string,maxsplit=0,, flags=0)
功能:⽤模式串做分隔符,将字符串分隔,返回分隔列表,如果模式加上括号,则
分隔符会被保留
参数:patter: 匹配的正则表达式string: 要匹配的字符串maxsplit 匹配次数,0不限制次数flags:模式修正符
返回值:成功返回⼦串列表,否则返回空列表
print(re.split(r'\d|,|;','w1w2w3w,w;w'))#['w', 'w', 'w', 'w',
'w', 'w']
- re.sub和re.subn
sub(pattern, repl, string, count=0)
subn(pattern, repl, string, count=0)
功能:在⽬标字符串中以正则表达式的规则匹配字符串,再把他们替换成指定的字
符串。可以指定替换的次数,如果不指定,替换所有的匹配字符串
参数:pattern: 正则表达式(规则)repl: 指定的⽤来替换的字符串string: ⽬标字符串count: 最多替换次数
区别:前者返回⼀个替换后的字符串,后者返回⼀个元组,第⼀个元素替换后的字符串,第⼆个元素表示被替换的次数
print(re.sub(r"(good)", "nice", "cheng is good man"))
print(re.subn(r"(good)", "nice", "cheng is good man"))
- re.group()和re.groups()
⽤于提取⼦元素,模式中⼀个括号就是⼀个⼦元素,group和groups只能在match和search⽅法⾥使⽤,通过返回的match object获取⼦元素。在模式串和sub和subn中的替换字符串中可以使⽤\1,\2,\3…来引⽤⼦元素
m = re.match(r"(\d{3})-(\d{8})", "010-53247654")
#使⽤序号获取对应组的信息,group(0)⼀直代表的原始字符串
print(m.group(0))
print(m.group(1))
print(m.group(2))
#查看匹配的各组的情况
print(m.groups())
- compile
当我们使.正则表达式时,re模块会.两件事 1、编译正则表达式,如果正则表达式本身不合法,会报错 2、.编译后的正则表达式去匹配对象编译正则表达式使.compile
原型:re.compile(pattern, flags=0)
功能:将正则表达式模式编译成正则表达式对象,其 match() 和 search() .
法可.于匹配
参数:pattern 模式flags 模式修饰符re_telephon = re.compile(r"^1(([3578]\d)|(47))\d{8}$") #编译,返回
print(re_telephon.match("13600000000")) #
4.应⽤实例
- 看样⼦
- 写⼀点,测⼀点
5.练习
- ⽤户名匹配:由数字、⼤⼩写字⺟、下划线_ 和中横线- 组成,⻓度为4到14位,并且不能以数字开头。
- 把下划线命名(也叫蛇形命名,所有单词都是⼩写,中间通过下划线连接),转化为⼩驼峰命名法(第⼀个单词⼩写,其余所有单词⾸字⺟⼤写)。例如’go_to_next_page’,转化后改写为’goToNextPage’。要求:⽤正则表达式替
换 - 匹配邮箱
- 匹配⼿机号
- 匹配身份证号。
- 匹配URL地址
- 匹配⽇期
- 匹配QQ号
- 匹配微信号
- 匹配⻋牌号
⼀、⾼阶函数
如果⼀个函数的参数是另外⼀个函数,那么这个函数就可以称为⾼阶函数
1 map
map是系统内置函数,map函数接收两个参数,⼀个是函数,⼀个是可迭代对象(Iterable),map将传⼊的函数依次作⽤到序列的每个元素,并把结果作为新的Iterator返回。
"""
map(function,iterable)
参数1:function,函数,函数的参数个数取决于后⾯序列的个数
参数2:iterable,⼀个序列或多个序列功能:将传⼊的函数依次作⽤于序列中的每⼀个元素,并把结果作为新的Iterator返回
"""
#1.传⼊函数⼀个参数
def fun(x):return x ** 2#需求:获取⼀个列表中每个元素的平⽅,⽣成⼀个新的列表
l1 = map(fun,[1,2,3,4])
print(l1) #<map object at 0x000001E86D3DA6D8> #返回的是迭代器
print(list(l1)) #[1, 4, 9, 16] #将迭代器转换为迭代对象#传⼊函数2个参数
l1 = [1,2,3,4]
l2 = [2,3,4,5,6,7]
def mul(x, y):return x * y
#注意如果两个列表⻓度不⼀样,以短的为主计算,函数是平⾏取值,也就是说x取l1的
值,y取l2的值
gen1 = map(mul,l1,l2) #可以使⽤lambda表达式
print(list(gen1)) #[2, 6, 12, 20]#提取字典的键
gen3 = map(lambda x:int(x),{'1':10,'2':20})
print(list(gen3)) #[1,2]#元组
gen4 = map(lambda x,y:(x,y),[1,2,3,4,5],[1,2,3])
print(list(gen4)) #[(1, 1), (2, 2), (3, 3)]
2 reduce
reduce()函数也是functools模块中的⼀个⾼阶函数。需要引⼊functools模块才能使⽤。
'''
functools.reduce(f, iterable[, initializer])
参数1:函数,这个函数需要两个参数。
参数2:可迭代对象
参数3:可选,是默认值
返回值:f函数计算的结果
'''
from functools import reduce
#1.累加求和
def add(x,y)return x + y
print(reduce(f,[1,2,3,4,5],5))
计算过程:
(1)a = f(1,2) #将1赋值给x,2赋值给y
(2)a = f(a,3) #a赋值给x,3赋值给y
(3)a = f(a,4)
(4)a = f(a,5)
(5)f(d,10) = 20#将序列变成整数
print(reduce(lambda x,y:x*10+y,[9,0,7,8])) #9078
3 filter
filter是内建函数,可以对可迭代对象进⾏过滤,去除不满⾜条件的元素
filter(function, iterable)
参数: function 确定是否保留元素,为真保留,为假去除元素,function的值可以
None
iterable 可迭代对象
返回值:⼀个新的迭代器或迭代对象
#1 过滤掉⾮字符串数据
print(filter(lambda x:isinstance(x,str),['1',8,'2',3,True,0.9]))
等价于:
[s for s in ['1',8,'2',3,True,0.9] if isinstance(s,str)]#2 回⽂数
#回⽂数判断
def is_palindrome(n):l1 = list(str(n)) #将数字转换为字符串,再将字符串转为列表l2 = l1[::-1] #获取反向列表if l1 == l2: #列表⽐较,⻓度相同,每⼀个元素都相同则为真return Truereturn False#找出1-1000内所有的回⽂数
print(list(filter(is_palindrome,range(1,1001))))
4 sorted
sorted是内建函数,⽤于对有序序列进⾏排序,⽣成⼀个新序列
sorted(iterable[, key][, reverse])
参数:iterable 排序对象,可以列表、元组、字符串等有序序列key 一个函数,作用于序列的每.个元素,根据函数返回值进行排序,具体的函数的参数就是取自于可迭代对象中,reverse 默认从小到大排序,如果reverse为True则从大到小排序
返回值: 新的序列
#字符串排序
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)) #指定
把元素变为小写后再排序#多维数据排序
l=[('a', 1), ('b', 2), ('c', 6), ('d', 4), ('e', 3)]
print(sorted(l,key=lambda x:x[1])) #使用元组的第二个元素排序students = [{'name':'abc','gender':'男','age':23} ,
{'name': 'kkd', 'gender': '男', 'age': 19} ,
{'name': 'ccxsbc', 'gender': '男', 'age': 20}]
print(sorted(students,key=lambda elem:elem['age'])) #指定.age排序
⼆、深拷⻉和浅拷⻉
元素分类:
- 不可变对象:int、float、bool、tuple、str
- 可变对象:list、dict、set
可变对象没有深拷.和浅拷贝的说法,不会产生副本
可变对象:列表、字典和集合 - 浅拷.:只复制容器,不复制容器中元素
- 深拷.:复制容器,如果容器中元素是可变的,元素也发生复制
#深复制和浅复制
import copy#不可变对象:int float boolean str,tuple,
#1.不可变对象不存在深考本和浅拷⻉
# a = 10
# b = a
#copy是浅拷⻉
# c = copy.copy(a)
# print(id(a),id(b),id(c)) #1766223152 1766223152 1766223152# s1 = "ok"
# s2 = copy.copy(s1)
# print(id(s1),id(s2)) #31192320 31192320#可变对象,list,dict set 容器
# a = [1,[5,6],3]
# 浅拷⻉ 只拷⻉容器,不拷⻉元素
# b = copy.copy(a)
# # print(id(a),id(b)) #42443848 42444040
# b[0] = 10
# print(a,b)
# print(id(a[1]),id(b[1])) #36152392 36152392#深拷⻉ ,既复制容器也复制元素(元素必须是可变对象)
a = [1,[5,6],3]
b = copy.copy(a)
c = copy.deepcopy(a)
print("a:",id(a),[id(x) for x in a])
print("b:",id(b),[id(x) for x in b])
print("c:",id(c),[id(x) for x in c])
"""
a: 42374664 [1766222864, 42374472, 1766222928]
c: 42375944 [1766222864, 42375880, 1766222928]
"""
a[0] = 10
# print(c) #[1, [5, 6], 3]
a[1][0]= 15
print(a)
print(b)
print(c)
第二十五天 正则表达式相关推荐
- 计算机三级网络技术题库第15套,计算机等级考试理论试题第二十五套
1.十进制数 141 转换成无符号二进制数是______. A.10011101 B.10001011 C.10001100 D.10001101 2.当前计算机感染病毒的可能途径之一是______. ...
- 第二十五章补充内容 3 assert()宏
//第二十五章补充内容 3 assert()宏 //有的编译器还提供了assert()宏,这个宏在许多书中被翻译为断言,它的作用是当assert()的参数为真时,返回真,假如参数值为假,那么它将执行某 ...
- Python编程基础:第二十五节 args参数*args
第二十五节 args参数*args 前言 实践 前言 我们目前学习到的函数的参数个数都是固定的,那么我们是否可以指定任意多个参数呢?其实是可以的,这里就用到了args参数,它可以将用户指定的任意多个参 ...
- 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十五章RTC实时时钟实验 实时时钟是很常用的一个外设 ...
- 鸟哥的Linux私房菜(基础篇)- 第二十五章、 Linux 备份策略
第二十五章. Linux备份策略 最近升级日期:2009/09/18 万一不幸你的 Linux 被黑客入侵了.或是你的 Linux 系统由於硬件关系 (不论是天灾还是人祸) 而挂掉了!这个时候,请问如 ...
- 第二十五章补充内容 5 不能为0的变量
// 第二十五章补充内容 5 不能为0的变量 /*#define DEBUG #include <iostream> #include <string> using names ...
- 求二叉树高度_LeetCode刷题——第二十五天(平衡二叉树)
这段时间跟二叉树杠上了,接下来还有许多二叉树的题目,虽然已经做了不少了,大多题目都涉及到了递归,也挺好,刚好有机会练习一下递归,但是遇到新的题目还是有点力不从心,还需要看参考答案,真希望有一天像汤神一 ...
- 第二十五章:重新吃上饭的李恪
第二十五章:重新吃上饭的李恪 可能李丽质永远都不会忘记了自己饿肚子饿了很久以来的第一顿饭吧. 吃的非常的香,吃完这顿饭以后,李丽质开始也参与到了洗皮衣的过程中,不过由于他个子比较小,所以只能做一些简单 ...
- NeHe OpenGL第二十五课:变形
NeHe OpenGL第二十五课:变形 变形和从文件中加载3D物体: 在这一课中,你将学会如何从文件加载3D模型,并且平滑的从一个模型变换为另一个模型. 欢迎来到这激动人心的一课,在这一课里,我们 ...
- 并查集路径压缩_第二十五天:并查集
今天是释然发题解的第二十五天,以后会经常和大家分享学习路上的心得,希望和大家一起进步,一起享受coding的乐趣 本文约1400字,预计阅读5分钟 昨天我们学习了动态规划之线性规划,忘记的小伙伴们可以 ...
最新文章
- 密码学摘要算法之MD5
- 当 “HTTP” 先生遇上“S”小姐
- nginx缓存和flask_cache
- ubuntu设置自动休眠
- 秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量
- linux 上传文件 rz命令 提示command not found 解决方法
- linux java jar打包_【Java】Java程序打包成jar包在Linux上运行
- Android程序的退出
- cacti+nagios整合(未成)
- 【每日算法Day 94】经典面试题:机器人的运动范围
- c++ 以当前时间为文件名打印日志
- 遗传算法(Python)
- 解析数论 1: Fourier积分和Fourier变换
- 初学vue,模仿个静态网站
- 《合作的进化》pdfmobiepub电子版
- 2017年最新苹果开发者账号注册申请流程最强详解!
- mysql中存储ip地址,将ip转换为整数存储
- python构建决策引擎_决策引擎与机器学习模型的集成 | 信数这么干(一)
- python出入库_练习1:python设计停车入库出库系统
- 通过Navicat创建MySQL数据库并倒入表数据的两种方式