第四十篇 re模块

re模块

import re

正则表达式,又称规则表达式。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本(也就是原字符串中有符合规则的就拿出来,没有就继续搜索)

元字符

s = 'I am king, I amam27 years old, I want to go to study'

# 1. ^ 获取开头字符
res = re.findall('^I',s)
print(res)    # ['I']

# 2. $ 获取结尾字符
res = re.findall('study$',s)
print(res)   # ['study']

# 3. | 左右两边都输出(or),获取左右两边
res = re.findall('I am 27 years|I want to',s)
print(res)    # ['I am 27 years', 'I want to']
res = re.findall('^I|study$',s)
print(res)    # ['I', 'study']

# 4. [] 获取字符串中所有符合[]中的元素,并按顺序输出
 res = re.findall('[oldI]',s)
 print(res)   # ['I', 'I', 'o', 'l', 'd', 'I', 'o', 'o', 'o', 'd']

# 5. . 一个 . 就是获取任意一个字符
res = re.findall('...',s)   每次获取三个任意字符
print(res)    # ['I a', 'm k', 'ing', ', I', ' am', ' 27', ' ye', 'ars', ' ol', 'd, ', 'I w', 'ant', ' to', ' go', ' to', ' st', 'udy']

# 6. {n}就是{}前的一个字符复制出n次之后组成的新字符串,去原字符串中找
# 如果{}前的字符串只有一个字符,且{}中是0,则表示用""(空)去匹配
st = '我我我我我我我我我我,我你,你我我我'
res0 = re.findall('你你{0}',st)   # “你”
res1 = re.findall('我{3}',st)    # “我我我”
res2 = re.findall('你我{3}',st)   # “你我我我”
print(res0)   # ['你', '你']
print(res1)   # ['我我我', '我我我', '我我我', '我我我']
print(res2)   # ['你我我我']

# 7. * 匹配前面的子表达式任意次。*等价于{0,}。
# 例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”、“zooo”.....
st = '我我我,我我,我'
res0 = re.findall('我你*',st)  # “我”、“我你”、“我你你”......
res1 = re.findall('你*',st)   # “”、“你”、“你你”......
print(res0)    # ['我', '我', '我', '我', '我', '我']
print(res1)    # ['', '', '', '', '', '', '', '', '']  似乎与C中的字符串和字符数组有点渊源,最后一个字符可能默认是\n

# 8. +  匹配前面的子表达式一次或多次(大于等于1次)。+等价于{1,}
# 例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。
st = '我我你我你,我我,我'
print(re.findall('你+',st))   # ['你', '你']
print(re.findall('我你+',st))   # ['我你', '我你']
# 需要理解贪婪和非贪婪,对于这些元字符,不加?都是默认为贪婪,也就是在搜索时,会尽量用匹配前面一个字符多次的去对比原字符串
print(re.findall('我+',st))   # ['我我', '我', '我我', '我']

# 9. ? 匹配前面的子表达式0次或1次.停止符
st = '我我你我你,我我,我,我你他'
print(re.findall('我?',st))  # ['我', '我', '', '我', '', '', '我', '我', '', '我', '', '我', '', '', '']

# 当 ? 字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少地匹配所搜索的字符串;而默认的贪婪模式则尽可能多地匹配所搜索的字符串。
# 例如,对于字符串“oooo”,“o+”将尽可能多地匹配“o”,得到结果[“oooo”],而“o+?”将尽可能少地匹配“o”,得到结果 ['o', 'o', 'o', 'o']

# 10. \d 匹配数字
stri = 'i am 26 years old'
print(re.findall('\d',stri))   # ['2', '6']

#11. \D  匹配非数字
stri = 'i am 26 years old'
print(re.findall('\D',stri))   # ['i', ' ', 'a', 'm', ' ', ' ', 'y', 'e', 'a', 'r', 's', ' ', 'o', 'l', 'd']

# 12. \w 匹配包括下划线的任何单词字符
st = '我我你_我你,我%我,我,我你他'
print(re.findall('\w',st))  # ['我', '我', '你', '_', '我', '你', '我', '我', '我', '我', '你', '他']

# 13 \W 非字母,数字,下划线
print(re.findall('\W',st))   # [',', '%', ',', ',']

# 14 \s 空
print(re.findall('\s',st))  # []

# 15. \S 非空
print(re.findall('\S',st))  # ['我', '我', '你', '_', '我', '你', ',', '我', '%', '我', ',', '我', ',', '我', '你', '他']

res = re.findall('^I.*?study$',s)
print(res)    ['I am king, I am 27 years old, I want to go to study']

# 16. (.*?) 非贪婪模式,找到一个了就停止
# 贪婪模式  .*
s = '孙悟空找猪八戒找媳妇妇妇高[email protected]@@@翠兰,然____后asdfasdf吃西234234瓜,再吃   西瓜妇'
res = re.findall('猪.*妇',s)
print(res)   # ['猪八戒找媳妇妇妇高[email protected]@@@翠兰,然____后asdfasdf吃西234234瓜,再吃   西瓜妇']
# 非贪婪模式
res = re.findall('猪.*?妇',s)
print(res)   # ['猪八戒找媳妇']

# 17. re.compile  写一个通用的规则(要用到前面学到的元字符)
s = 'i am 173'
form1 = re.compile('\d')
form2 = re.compile('\D')

res1 = form1.findall(s)
res2 = form2.findall(s)

print(res1)   # ['1', '7', '3']
print(res2)   # ['i', ' ', 'a', 'm', ' ']

# 18. match和search

# re.match从头开始匹配,找一个,如果在开头没有则返回None
s = '从前有座山,山里有个庙'
res = re.match('有',s)
print(res)    # None
s = '有座山,有座庙'
res = re.match('有',s)
print(res)   # <_sre.SRE_Match object; span=(0, 1), match='有'>

# re.search 搜索所有
s = '从前有座山,山里有个庙'
res = re.search('有',s)
print(res)   # <_sre.SRE_Match object; span=(2, 3), match='有'>

# 19. 分组,需要的数据放入()就行了,括号外的就不会打印了
s = '有踢球的,有跑步的,有看书的,'
res = re.findall('有(.*?),',s)
print(res)   # ['踢球的', '跑步的', '看书的']

# 20. re.split  与字符串的相似,只是里面的参数用正则表达式
s = 'i am 26 years old'
res = re.split('\d',s)
print(res)   # ['i am ', '', ' years old']

#21. sub 和 subn

# 和字符串中的replace相似,subn会计算替换的次数
s = '昨天是1号,今天是2号,明天3号,后天4号放假'

# re.sub
sub_res = re.sub('\d','*',s)
print(sub_res)   # 昨天是*号,今天是*号,明天*号,后天*号放假

# re.subn
subn_res = re.subn('\d','*',s)
print(subn_res)   # ('昨天是*号,今天是*号,明天*号,后天*号放假', 4)

原文地址:https://www.cnblogs.com/itboy-newking/p/11041723.html

时间: 2024-07-31 11:52:54

第四十篇 re模块的相关文章

小刘同学的第四十篇博文

开通博客已经四十天了啊,时间真是快的有点不太真实,也可能是太过真实了...总之无论发生了什么事儿,生活还是要继续. 今天状态没想到比昨天更差了,特别是下午和晚上,基本上没做什么事了,哎,放寒假了还天天跑来理工大学做什么?如果是来自习的,那干嘛还帅微博.刷空间动态呢? 上午的时候稍微看了下Vue.js的相关内容,看文档好像没什么好看的,就听老师讲课的时候,讲了一些内容,具体也不是很用心的在看.不过还是把老师的笔记再手敲一遍吧,给大家看看. vue的概念: 模板引擎 通常这个概念出现在应用层(MVC

python第四十九天--paramiko模块安装大作战

准备开始学习:paramiko模块,发现这个模块十分难搞 安装不上 搞了半天,win10 64下 pytyon 3.6 的 paramiko模块 死活安不上,在网上不断的找资料,可是没有用,没有用啊 无法,用虚拟机搞个centos7,安装,失败,再安装,再失败,上网找资料,终搞定,分享一下经验,免得大家再踩坑. 环境 centos 7 ,自带python 2.7,不用管它 安装新python3 第一步:下载python3.5安装包: wget --no-check-certificate htt

Android Studio - 第四十八期 模块ViewPager+Fragment

最近一直在review撸撸的代码,发现了一种模块的写法,非常不错,独立出来,希望能帮到你~ 如果你遇到这样的页面,怎么办,不会把所有代码都写到一个页面中吧~,这样看你代码的人会骂死你的吧~我想~而且如果不同的版本要用不同的位置,大小也不一样,难道你要重新布局嘛~这都是开发中需要纠结的,下面就开始正题了,这是利用了以前讲过的多版本打版以及配置多Fragment加载巧妙的解决了复杂的页面逻辑,我数了数,首页代码不到一百行,厉害吧~哈哈哈哈~ 在写这样的页面之前给大家介绍一下怎么写一个页面模块代码.

mysql 第四十篇文章~canal+otter的初次尝试

一 简介: 今天咱们来聊聊 canal和otter的组合搭配吧二 概念统计    1. 基于Canal开源产品,获取数据库增量日志数据. 2. 典型管理系统架构,manager(web管理)+node(工作节点) a. manager运行时推送同步配置到node节点 b. node节点将同步状态反馈到manager上 3. 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作. 三 机器组成: 1 manager节点(最好自带数据库)  2 node节点   3 ZK集群

Python进阶【第十篇】模块(上)

·一.模块 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能.为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Module). 当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块. 模块主要有三种: Python标准库 第三方模块 应用程序自定义模块 另外,使用模

Python之路(第二十篇) subprocess模块

一.subprocess模块 subprocess英文意思:子进程 那什么是进程呢? (一)关于进程的相关理论基础知识 进程是对正在运行程序的一个抽象,进程的概念起源于操作系统,是操作系统最核心的概念,操作系统的其他所有内容都是围绕进程的概念展开的. 所以想要真正了解进程,必须事先了解操作系统. 程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作,这个繁琐的工作就是操作系统来干的,有了他,程序员就从这些繁琐的工作中解脱了出来,只需要考虑自己的应用软件的编写就可以

第二十篇 sys模块

修改环境变量 import sys sys.path.append() 但是,这种修复方式只是临时修改 如果要永久修改,就要电脑里配置环境变量. sys.argv:命令行参数List,第一个元素是程序本身路径 import sys print(sys.argv) # ['F:/workspace/OldBoy/源码/课件与源码/python全栈3期-课件与源码/day22源码/day22课堂代码/day22/sys_test.py'] command=sys.argv[1] path=sys.a

第四十篇 Numpy.array的基本操作——向量及矩阵的运算

No.1. Numpy.array相较于Python原生List的性能优势 No.2. 将向量或矩阵中的每个元素 + 1 No.2. 将向量或矩阵中的所有元素 - 1 No.3. 将向量或矩阵中的所有元素 * 2 No.4. 将向量或矩阵中的所有元素 / 2 或 // 2 No.5. 幂运算 No.6. 取余 No.7. 取绝对值 No.8. 三角函数 No.9. 取e的x方 No.10. 取任意数的x方 No.11. 取以e为底x的对数 No.12. 取以任意数为底x的对数 No.13. 矩阵

无限互联奖学金文章连载北京总部四十九期胡梦川 第一篇

无限互联奖学金文章连载北京总部四十九期胡梦川 第一篇: 今天是来到无限互联的第四天,严格来说已经第六天了,刚来就是开班典礼,给人一种很好的氛围.老师讲了很多关于以后学习的技巧和规定,我的第一感觉是,比备战高考还要严格,不过这才能体现一个组织的负责任.正式开讲才感觉到这个班级的大神无处不在,不努力根本赶不上,就是这个学习氛围和高强度的练习很重要.多用心你才能感觉到有些事其实很简单.关于学习时间大家基本都是一天不动的在敲代码,等于给自己一个机会吧.时间飞逝,抓住机会才重要.刚来第一周,感受最深就是好