Python笔记_第四篇_高阶编程_正则表达式_2.正则表达式入门
1. 匹配单个字符和数字:
. --->> 匹配除换行符以外的任意字符。
[0123456789] --->> []字符集合,表示匹配方括号中所包含的任意一个字符。
[Thomas] --->> []字符集合,表示匹配方括号中所包含的任意一个字符。匹配'T','h'...任意一个字符。
[a-z] --->> - 匹配任意小写字母
[A-Z] --->> - 匹配任意大写字母
[0-9] --->> 匹配任意数字,类似于[0123456789]
[0-9a-zA-Z] --->> 匹配任意的数字和字母(包含大小写)
[0-9a-zA-Z_] --->> 匹配任意的数字和字母(包含大小写)和下划线
[^Thomas] --->> 匹配除了Thomas这几个字母以外的所有字符,中括号里面的^称为脱字符,表示不匹配集合中的字符。
[^0-9] --->> 匹配所有的非数字字符。
\d --->> 匹配数字,效果同[0-9]
\D --->> 匹配非数字字符,效果同[^0-9]
\w --->> 匹配数字,字母和下划线,效果同[0-9a-zA-Z_],判断标识符比较合适
\W --->> 匹配数字,字母和下划线,效果同[^0-9a-zA-Z_],判断标识符比较合适
\s --->> 匹配任意的空白符(空格,换行,回车,换页,制表),效果同[ \f\n\r\t]
\S --->> 匹配任意的非空白符(空格,换行,回车,换页,制表),效果同[^ \f\n\r\t]
print(re.search(".","Thomas is a good man"))
# <re.Match object; span=(, ), match='T'> print(re.search("[0123456789]","Thomas is a good man_ 7"))
# <re.Match object; span=(, ), match=''> print(re.search("[Thomas]","Thomas is a good man_ 7"))
# <re.Match object; span=(, ), match='T'> print(re.search("[a-z]","Thomas is a good man_ 7"))
# <re.Match object; span=(, ), match='h'> print(re.search("[A-Z]","Thomas is a good man_ 7"))
# <re.Match object; span=(, ), match='T'> print(re.search("[0-9]","Thomas is a good man_ 7"))
# <re.Match object; span=(, ), match=''> print(re.search("[0-9a-zA-Z]","Thomas is a good man_ 7"))
# <re.Match object; span=(, ), match='T'> print(re.search("[0-9a-zA-Z_]","_Thomas is a good man_ 7"))
# <re.Match object; span=(, ), match='_'> print(re.search("[^Thomas]","_Thomas is a good man_ 7"))
# <re.Match object; span=(, ), match='_'> print(re.search("[^0-9]","Thomas is a good man_ 7"))
# <re.Match object; span=(, ), match='T'> print(re.search("\d","Thomas is a good man 7"))
# <re.Match object; span=(, ), match=''> print(re.search("\w","_Thomas is a good man 7"))
# <re.Match object; span=(, ), match='_'> print(re.search("\s","_Thomas is a good man 7"))
# <re.Match object; span=(, ), match=' '>
2. 锚字符(边界字符):
^ --->> 行首匹配,和在[]里的^不是一个意思
$ --->> 行尾匹配
\A --->> 匹配字符串开始,它和^区别是:\Z只匹配整个字符的开头,即是re.M模式下也不会匹配它行的行首。
\Z --->> 匹配字符串结束,它和$区别是:\Z只匹配整个字符的开头,即是re.M模式下也不会匹配它行的行尾。
\b --->> 匹配单词的边界,也就是值单词和空格间的位置。r'er\b':可以匹配never,不能匹配nerve,单词的边界。
\B --->> 匹配非单词的边界,也就是值单词和空格间的位置。
print(re.search("^Thomas","Thomas is a good man 7"))
# <re.Match object; span=(, ), match='Thomas'> print(re.search("Thomas$","Thomas is a good man Thomas"))
# <re.Match object; span=(, ), match='Thomas'> print(re.findall("^Thomas","Thomas is a good man\nThomas is a nice man",re.M))
# ['Thomas', 'Thomas'] print(re.findall("\AThomas","Thomas is a good man\nThomas is a nice man",re.M))
# ['Thomas'] print(re.findall("man$","Thomas is a good man\nThomas is a nice man",re.M))
# ['man', 'man'] print(re.findall("man\Z","Thomas is a good man\nThomas is a nice man",re.M))
# ['man'] print(re.search(r"er\b","never"))
# <re.Match object; span=(, ), match='er'>
print(re.search(r"er\b","nerve"))
# None print(re.search(r"er\B","never"))
# None
print(re.search(r"er\B","nerve"))
# <re.Match object; span=(, ), match='er'>
3. 匹配多个字符:
说明:下方的x、y、z均为假设的普通字符,n、m是非负整数,不是正则表达式的元字符。
(xyz) --->> 匹配小括号内的xyz(作为一个整体去匹配)
x? --->> 匹配0个或者1个x。
x* --->> 匹配0个或者任意多个个x。(.* 表示匹配0个或者任意多个字符(换行符除外))
x+ --->> 匹配至少一个x
x{n} --->> 匹配确定n个x(n是一个非负整数)
x{n,} --->> 匹配至少n个x
x{n,m} --->> 匹配至少n个最多m个x,注意n<=m。
x|y --->> | 表示或,匹配的是x或y
print(re.findall(r"(Thomas)","Thomasgood is a good man,Thomas is a nice man"))
# ['Thomas', 'Thomas'] print(re.findall(r"o?","ooo")) # 非贪婪匹配(尽可能少的匹配)
# ['o', 'o', 'o', ''] print(re.findall(r"o*","oooboo")) # 贪婪匹配(尽可能多的匹配)
# ['ooo', '', 'oo', ''] print(re.findall(r".*","oooboo"))
# ['oooboo', ''] print(re.findall(r"o+","oooboo"))
# ['ooo', 'oo'] print(re.findall(r"o{2}","oooboo"))
# ['oo', 'oo'] print(re.findall(r"o{2,}","oooboo")) # 也是贪婪匹配
# ['ooo', 'oo'] print(re.findall(r"a{3,6}","aaaabaaa"))
# ['aaaa', 'aaa'] # 最多6个也可以是4个 print(re.findall(r"((t|T)homas)","thomas--Thomas"))
# [('thomas', 't'), ('Thomas', 'T')] # 这是组 print(re.findall(r"(t|T)homas","thomas--Thomas"))
# ['t', 'T']
# 需求,提取Thomas****man
str = "Thomas is a good man!Thomas is a nice man!Thomas is a very handsome man"
print(re.findall(r"Thomas.*?man",str))
# ['Thomas is a good man', 'Thomas is a nice man', 'Thomas is a very handsome man']
4. 特殊形式:
*? +? ?? --->> 最小匹配,通常都是尽可能多的匹配,可以使用这种方式解决贪婪匹配。
(?:x) --->> 类似(xyz),单不表示一个组
# 注释:/* part1 */ /* part2 */
print(re.findall(r"//*.*?/*/",r"/* part1 */ /* part2 */"))
# ['/* part1 */', '/* part2 */']
5. 实例:
我们在回过头来解决那个电话号码的问题。
def checkPhone2(str):
#
pat = r"^1(([34578]\d)|(47))\d{8}$"
res = re.match(pat,str)
return res print(checkPhone2(""))
# <re.Match object; span=(, ), match=''>
print(checkPhone2(""))
# None
print(checkPhone2("1391234a678"))
# None
print(checkPhone2(""))
# None
print(checkPhone2(""))
# None
Python笔记_第四篇_高阶编程_正则表达式_2.正则表达式入门的更多相关文章
- Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速
Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...
- Python开发【第十三篇】高阶函数、递归函数、闭包
函数式编程是指用一系列函数解决问题 好处:用每个函数完成每个细小的功能,一系列函数任意组合能够解决大问题 函数仅仅接收输入并产生输出,不包含任何能影响输出的内部状态 函数之间的可重入性 当一个函数的输 ...
- python学习三十四天函数高阶函数定义及用法
python函数高阶函数是把函数当成一个变量,传递给函数作为参数,或者函数的返回值里面有函数,都称为高阶函数, 1,把函数作为参数传递 def dac(x,y): return x+y def tes ...
- Python笔记_第四篇_高阶编程_实例化方法、静态方法、类方法和属性方法概念的解析。
1.先叙述静态方法: 我们知道Python调用类的方法的时候都要进行一个实例化的处理.在面向对象中,一把存在静态类,静态方法,动态类.动态方法等乱七八糟的这么一些叫法.其实这些东西看起来抽象,但是很好 ...
- Python笔记_第四篇_高阶编程_魔法(术)方法详解(重载的再详解)
1. 魔法方法是什么? 魔法方法(Magic Method)是Python比较独特的应用,它可以给你的类增加特殊的方法,如果你的对象实现了(重载),这些方法中的某一个,就会被Python所调用.正如装 ...
- Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数
1. 概述: 我们在前面用了很多的装饰器这个工具的方法.这个位置要系统的讲一下装饰器. 1.2 为什么需要装饰器. 装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额 ...
- Python笔记_第四篇_高阶编程_进程、线程、协程_4.协程
1.协程的概念: 子程序或者子函数,在所有语言中都是层级调用,比如A调用B,再B执行的过程中又可以调用C,C执行完毕返回,B执行返回,最后是A执行完毕返回.是通过栈来实现的,一个线程就是执行一个自称, ...
- Python笔记_第四篇_高阶编程_进程、线程、协程_3.进程vs线程
1.多任务的实现原理: 通常我们会设计Mater-Workder模式,Master负责分配任务,Worker负责执行任务,因此多任务环境下,通常是一个Master,多个Worker 2.多进程: 主进 ...
- Python笔记_第四篇_高阶编程_进程、线程、协程_1.进程
1. 多任务原理: 现代操作系统,像win,max os x,linux,unix等都支持多任务. * 什么叫做多任务? 操作系统可以同时运行多个任务. * 单核CPU实现多任务原理? 操作系统轮流让 ...
随机推荐
- Metasploitable学习(一)
划红线的是执行语句,对已知的服务器的IP地址进行扫描.嗅探
- namenode节点无法自动切换主从
当停掉主namenode节点,从节点无法切换到active状态,有两种可能导致这种问题 1.查看namenode上的zkfc日志,发现没有fuser命令,需要手动安装 yum install -y p ...
- 使用UltraISO(软碟通)制作U盘制作启动盘完整教程
背景:服务器需要安装系统,但是没有启动盘只有镜像. 前提:U盘和安装镜像准备好 步骤一:首先我们先安装软碟通,完成安装后打开软碟通,文件->打开,打开我们需要制作的iso镜像.如下图(也可下本地 ...
- 转载:HTTP 请求头中的 X-Forwarded-For
本文转自:https://www.jianshu.com/p/15f3498a7fad X-Forwarded-For和相关几个头部的理解 $remote_addr 是nginx与客户端进行TC ...
- SMPL模型Shape和Pose参数
两部分 1.Pose参数 2.Shape参数 一 Pose参数 共24个关节点,对应idx从0到23,图中3个小图分别表示zero shape只有idx节点分别绕x/y/z轴旋转. 其中蓝色线表示-p ...
- python -- 犯过的错之变量作用域
1.写代码时发现取得变量值,会被覆盖,改为图二的写法后case_id则不会覆盖. 原因:可以理解为变量是内存中一个对象的“引用”.在函数参数传值时,变量也是内存对象的引用. 当对象为可更改对象时,是引 ...
- P3045 [USACO12FEB]牛券Cow Coupons
P3045 [USACO12FEB]牛券Cow Coupons 贪心题.先选中 \(c_i\) 最小的 \(k\) 头牛,如果这样就超过 \(m\) ,直接退出,输出答案.否则考虑把后面的牛依次加入, ...
- tensorflow--保存加载模型
s=mnist.train.next_batch(batch_size)print(xs.shape)print(ys.shape) # #从集合中取全部变量# tf.get_collection() ...
- python类、super函数
#PYTHON语言及其应用学习笔记 1.创建简单的类 class Person(): #python中特殊的对象初始化方法__init__,一个特殊的函数名 #当你在类声明里定义__init__()方 ...
- EUI库 - 皮肤
皮肤分离机制 皮肤分离机制对制作可复用的外观比较有优势 那对于只使用一次的皮肤呢?如果也拆分出两个文件,显然不太方便.这里我们针对单次使用的皮肤定制了内部类的功能 每个组件都有一个chi ...