###############     re模块   ################

正则表达式的规则:

# re模块
# 正则表达式,就是做字符串匹配的,在re模块出现之前就有这个正则表达式了,任何语言都有这个,
# 要使用Python来操作正则表达式,就要使用到re模块了,
# # 正则表达式只和字符串匹配有关系,和其他的数据类型没有关系, # 应用非常的广泛,
# 比如手机号,
# 比如身份证号
# 比如邮箱, # 实现手机号的格式验证:
# 不使用正则表达式,使用Python代码也是可以实现的
# while True:
# phone_number = input('please input your phone number : ')
# if len(phone_number) == 11 \
# and phone_number.isdigit()\
# and (phone_number.startswith('13') \
# or phone_number.startswith('14') \
# or phone_number.startswith('15') \
# or phone_number.startswith('18')):
# print('是合法的手机号码')
# else:
# print('不是合法的手机号码') # 使用正则表达式,会把这个过程变的非常的简洁
# 正则表达式在处理字符串匹配上有非常的优势
# import re
# phone_number = input('please input your phone number : ')
# if re.match('^(13|14|15|18)[0-9]{9}$',phone_number):
# print('是合法的手机号码')
# else:
# print('不是合法的手机号码') # 正则表达式的规则:
##################################################################
# 字符组: # 字符组:[字符组] 一个字符串只能是表示一位
# 正则 待匹配 匹配结果
# [0123456789] 8 True
# [0123456789] a False # 注意这种写法,一般不这么写,但是这么写是可以的,你要知道
# [0 - 9] 7 True # 所以匹配所有的数字就是这么写
# [a-z] s True # 匹配所有的小写字母
# [A-Z] S True # 匹配所有的大写字母
# [0-9a-zA-Z] e True # 匹配大小写字母和所有的数字, ##################################################################
# 元字符 # . 匹配除换行符以外的任意字符
# \w 匹配字母或数字或下划线,word的意思,
# \W 匹配非字母或数字或下划线
# \s 匹配任意的空白符,space的意思
# \S 匹配非空白符
# \d 匹配数字,digit的意思
# \D 匹配非数字
# 注意你把上面的两对放入一个字符组里面去,匹配的都是全局,[\w\W] [\s\S],但是我们不这么用 # \n 匹配一个换行符,
# \t 匹配一个制表符,就是一个tab键, # \b 匹配一个单词的结尾 # 这个不常用, # ^ 匹配字符串的开始
# $ 匹配字符串的结尾
# ^[a-z]$ 这就是表示只能有一个字符,并且是小写,
# 一个字符组只能匹配一个字符, # a|b 匹配字符a或字符b 主要是记住这个 | 这是或的关系, # () 匹配括号内的表达式,也表示一个组
# [...] 匹配字符组中的字符
# [^...] 匹配除了字符组中字符的所有字符,前面加了^ 这是非的意思, # -----------------------
# 你学了上面的写着字符组和元字符,那么你所有的单个字符都可以匹配了,
# 但是匹配一个手机号你还是不行,
# [\d\d\d\d\d\d\d\d\d\] 不能是这样, ####################################################################
# 量词 # 用法说明
# * 重复零次或更多次,\d*不管有多少的数字都能匹配上,这种叫做贪婪匹配,但是遇到一个非数字就停止了,
# + 重复一次或更多次,\d+这种也是贪婪的,但是不能是零次
# ? 重复零次或一次,\d?,
# {n} 重复n次,,这种可以指定重复次数,
# {n,} 重复n次或更多次
# {n,m} 重复n到m次
# 所有的量词都要匹配到元字符的后面,而且要紧贴着 # 举例:
# 海盐海草海梅
# 怎么把所有的匹配出来:海. 记住这个点还是代表的一个字符,
# 怎么只匹配到第一个:^海. # 举例:
# 李杰和李莲英和李二棍子
# 怎么把所有的人名都匹配出来:
# 各种错误匹配解析:
# 第一种:李. 不行
# 第二种:李.? ?号只能匹配李后面0个或1个字符,贪婪匹配,就是1个,
# 第三种:李.* 匹配li后面的0个或多个字符,贪婪匹配,后面越多越好,
# 第四种:李.+ 匹配li后面的1个或多个字符,贪婪匹配,后面越多越好,
# 第五种:李.{1,2} {1,2}匹配1到2次任意字符,会匹配到三个,这种也是贪婪匹配,所以以2为主
# 第六种:李.{1,2}? # 这种加一个问号就是一个非贪婪匹配了,也叫做惰性匹配,
# 所以注意了,问好有两个用法了,
# 第七种:李.*? 这种加了问号变成非贪婪匹配,就变成了,以0个了为基准了,惰性匹配, # 正确的匹配,
# 第一种:李[^和]*,这种是可以的
# 第二种:李[杰莲英二棍子]* ##################################################################
# 分组:
# 使用()
# 上面我们看到如果想要使用量词,只能约束和他紧邻的一个字符组,如果我想要约束多个怎么办
# 就是使用括号把多个字符放入一个括号,这就是分组,然后约束就是约束这个组了, # 身份证号码:
# 是一个长度为15或18个字符的字符串,
# 如果是15位则全部是数字组成,首位不能为0;
# 如果是18位,则前17位全部是数字,末位可能是数字或x, # 第一种: ^[1-9]\d{13,16}[0-9x]$
# 分析这种是^[1-9],是首位不能为0;\d{13,16} 是约束中间的,[0-9x]$末位可能是数字或x,
# 但是有问题,就是这个\d{13,16} ,这个弹性太大,只能是15,18,不能是16,17位的
# 而且即使15位也是可以x结尾,这是不行的, # 第二种:^[1-9]\d{14}(\d{2}[0-9x])?$
# 分析:^[1-9],\d{14},(\d{2}[0-9x])?$
# 关键是第三部分,最后一个分组,要么都匹配上,要么就是没有,很巧妙
# 这就是一个成功的了 # 第三种:^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
# 分析:[1-9]\d{16}[0-9x] [1-9]\d{14}
# 这种很巧妙,就是封成了1组,但是中间是或,就是写了两种,#
# 一定注意把长的规则放到前面,不能把短的规则放到前面,,
# 这也是一个成功的, ####################################################################
# 转义符
# 如果就是想要匹配\d怎么办?
# 就需要转译,\\d,这种就是转义了,
# 如果我想要匹配: \\d 怎么办,就要使用\\\\d,每一个反斜杠都要 转义, # 很麻烦,怎么办?
# r'\\n' r'\n' 在字符串之前加r,让整个字符串不转义 #####################################################################
# 贪婪匹配,一直往后匹配
# 加问号是惰性匹配,
# *? 重复任意次,但尽可能少重复
# +? 重复1次或更多次,但尽可能少重复
# ?? 重复0次或1次,但尽可能少重复
# {n,m}? 重复n到m次,但尽可能少重复
# {n,}? 重复n次以上,但尽可能少重复 # .*?的用法
# . 是任意字符
# * 是取 0 至 无限长度
# ? 是非贪婪模式。
# 何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:.*?x
# 就是取前面任意长度的字符,直到一个x出现 #######################################################################
# 上面就是正则的规则了,学会了这些就够你使用的了
# 需要灵活使用这些,这个规则是不会改变的,

re模块的用法:

# re模块
import re #############################################
# ret = re.findall("[a-z]+","abc aaa an")
# print(ret) # ['abc', 'aaa', 'an'],这是放到列表中,
# # [a-z]+这就是第一个是a-z,后面是匹配任意的1到多次, ############################################
# ret = re.search("[a-z]+","abc aaa an").group()
# print(ret) # ['abc', 'aaa', 'an'],这是放到列表中,
# 这个search是找到一个就返回,而且一定要使用group才会出结果,
# 如果结果找不到就会报错,报错是因为结果是none所以调用group会报错的, # 一般是这么用的
# # ret = re.search("[a-z]+","abc aaa an")
# ret = re.search("t","abc aaa an")
# if ret:
# ret = ret.group()
# print(ret)
# else:
# print("找不到") ##############################################
# match是从头匹配,如果匹配上就会返回一个变量,然后使用group显示,
# 匹配不上,就是none使用group会报错,
# 同search,不过尽在字符串开始处进行匹配
# ret = re.match("aaa","abc aaa an")
# if ret:
# ret = ret.group()
# print(ret)
# else:
# print("找不到") #####################################################
# ret = re.split("[ab]","abcd")
# print(ret) # ['', '', 'cd']
# 为什么是这个结果,因为是按照a和b分割,先按照a,然后按照b
# 这个不太常用 ###################################################
# ret = re.sub("\d","H","eefeflef4fefe4",1)
# print(ret)
# 这个方法是替换,把第一个参数替换成为第二个参数,文本就是第三个,替换次数就是第四个参数,不写的还就是全部替换, ###################################################
# ret = re.subn("\d","H","eefeflef4fefe4",1)
# print(ret) # ('eefeflefHfefe4', 1)
# 这个方法不只是把替换的结果返回来,还会把替换的次数给你返回回来, ###################################################
# 如果你想要把一个正则规则反复使用,或者这个规则非常长的时候可以使用一个方法 # obj = re.compile("\d{3}") # 可以反复使用这个正则,
# ret = obj.search("abc123afdfadsf")
# print(ret.group())
# ret = obj.search("abcafdfadsf456")
# print(ret.group()) #####################################################
# 如果返回的结果非常的多,可以使用迭代器,
# import re
# ret = re.finditer('\d', 'ds3sy4784a') # finditer返回一个存放匹配结果的迭代器
# print(ret) # <callable_iterator object at 0x10195f940>
# print(next(ret).group()) # 查看第一个结果
# print(next(ret).group()) # 查看第二个结果
# print([i.group() for i in ret]) # 查看剩余的所有结果 ######################################################## # ret = re.search("^[1-9]\d{14}(\d{2}[0-9x])?$","370883199908181818")
# print(ret.group())
# print(ret.group(1)) # 这是取值第一个分组,现在就是只有一个分组,818
# 如果你就知道为什么要使用group了, ######################################################## # import re
#
# ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
# print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
#
# ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
# print(ret) # ['www.oldboy.com']
# # 这是问号的第三个用法了, ##############################################
ret=re.split("\d+","eva3egon4yuan")
print(ret) # 结果 : ['eva', 'egon', 'yuan'] ret=re.split("(\d+)","eva3egon4yuan")
print(ret) # 结果 : ['eva', '3', 'egon', '4', 'yuan']
# 在匹配部分加上()之后所切出的结果是不同的,
# 没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
# 这个在某些需要保留匹配部分的使用过程是非常重要的。
# 这个还是非常的有用的,

############################################

例题:

# 字符串a = "not 404 found 张三 99 深圳",每个词中间是空格,用正则过滤掉英文和数字,最终输出"张三 深圳"
a = "not 404 found 张三 99 深圳"
list1 = a.split(" ")
print(list1) # ['not', '404', 'found', '张三', '99', '深圳']
import re
ret = re.findall("\d+|[a-zA-Z]+",a)
for i in ret:
if i in list1:
list1.remove(i)
print(list1) # ['张三', '深圳']
new_str = " ".join(list1)
print(new_str) # 张三 深圳

###########################################

###########################################

python语法基础-常用模块-re模块的更多相关文章

  1. python语法基础-常用模块-长期维护

    ###############      常用模块   ################ # 常用模块: # 1,collections模块 # 2,时间模块,time模块,datatime模块 # ...

  2. (数据分析)第02章 Python语法基础,IPython和Jupyter Notebooks.md

    第2章 Python语法基础,IPython和Jupyter Notebooks 当我在2011年和2012年写作本书的第一版时,可用的学习Python数据分析的资源很少.这部分上是一个鸡和蛋的问题: ...

  3. python语法基础笔记

    本篇笔记基于博主自己的的学习,理解,总结所写.很多东西可能存在误解,不能保证百分之百的正确. 1. 数据表达1.1 常量和变量1.2 数据类型1.2.1 基本数据元素1.2.1.1 数字1.2.1.2 ...

  4. Python | Python语法基础

    目录 前言 1. 变量与简单数据结构 2. 列表相关 3. 集合 4. If语句 5. 字典 6. 用户输入和while循环 7. 函数 8. 类与对象 9. 文件 10. 异常 11. 测试 最后 ...

  5. python语法基础-并发编程-线程-线程理论和线程的启动

    #######################       线程介绍         ############################## """ 线程介绍 为什 ...

  6. python 笔记2:python语法基础

    python语法学习笔记: 1 输入输出 input(),print(). name = input('input your name : ')print('hello ,'+name)print(& ...

  7. Python 第三篇(上):python文件基础操作、json模块、lambda、map、filter、reduce和函数位置参数

    python一切皆对象,linux一切皆文件,python操作文件是很常见的O/I操作,其内置来open()函数可以完成文件的基本操作: 一:使用内置open()函数操作文件,基本语法如下: with ...

  8. Python语言基础04-函数和模块的使用

    本文收录在Python从入门到精通系列文章系列 在分享本章节的内容之前,先来研究一道数学题,请说出下面的方程有多少组正整数解. 事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案. ...

  9. Python入门基础学习(时间模块,随机模块)

    Python基础学习笔记(六) time模块: 时间的三种表示方法: 1.格式化字符串 2.时间戳 用来表示和1970年的时间间隔,单位为s 3.元组 struct_time 9个元素 time的st ...

随机推荐

  1. springcloud之Eureka上

    0 环境 系统环境:win10 编辑器:IDEA 1 注册中心 Eureka是springcloud中的注册中心.原因: 当是单体应用 类似一条直线 随着项目越来越大 系统拆分 类似那个藕(模块间相互 ...

  2. 代码杂谈-SQL中的rank&row_number函数

    两个函数细节记不住. 写个例子备注一下. select no, name, score , rank() over(partition by no order by score asc) rk1 , ...

  3. windows下MariaDB忘记密码找回

    1.首先停止数据库 2.找到my.ini文件 3.右键以记事本打开在Mysqld下添加如下一行保存,然后启动数据库 4.登录数据库会提示输入密码,默认回车即可 5.退出数据库,删除我们上面在my.in ...

  4. visualVM远程监控jetty

    1.打开本体bin/visualvm 2.添加远程主机 3.启动应用,使用以下方式 java -Djava.rmi.server.hostname=远程IP地址 -Dcom.sun.managemen ...

  5. tar.xz文件

    创建或解压tar.xz文件的方法 习惯了 tar czvf 或 tar xzvf 的人可能碰到 tar.xz也会想用单一命令搞定解压或压缩.其实不行 tar里面没有征对xz格式的参数比如 z是针对 g ...

  6. 下载安装MySQL(MacOS)

    在安装MySQL服务器之前,首先要做的事情就是去MySql的官网下载适合自己系统的MySQL版本 https://www.mysql.com/ 点击上方的DOWNLOAD 拉到屏幕最底部选择MySQL ...

  7. Anaconda Installation on Mac: conda command not found 环境变量配置

    Mac系统安装完Anaconda 3.7后在terminal输入conda --version,返回command not found 原因可能是没有配置环境变量 在terminal输入vi ~/.b ...

  8. Django2.0——路由配置

    URL配置就像是Django所支撑网站的目录,它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表.URL需要在urls.py进行配置,与其对应的视图函数写在views.py文件中.ur ...

  9. Python笔记_第一篇_面向过程_第一部分_5.Python数据类型之列表类型(list)

    Python中序列是最基本的数据结构.序列中的每个元素都分配一个数字(他的位置或者索引),第一个索引是0,第二个索引是1,依次类推.Python的列表数据类型类似于C语言中的数组,但是不同之处在于列表 ...

  10. Python基础学习三

    Python基础学习三 1.列表与元组 len()函数:可以获取列表的元素个数. append()函数:用于在列表的最后添加元素. sort()函数:用于排序元素 insert()函数:用于在指定位置 ...