python常用模块之re模块(正则)
python种的re模块常用的5种方法,分别是re.match re.search re.findall re.split re.sub。
在介绍五种方法之前,需要介绍一下正则的基础。
- . 表示任意字符,除\n以为
- \ 转义字符
- [...] 字符集,表示取其中任意一个字符。比如[abc]d 可以匹配到ad bd cd。
- \d 表示数字,等同于[0-9]
- \D 表示非数字 [^\d]
- \s 表示空格
- \S 表示非空格
- \w 表示单词字符 [a-zA-z_0-9]
- \W 表示非单词字符 [^\w]
- * 匹配前面0个或多个字符
- + 匹配前面1个或多个字符
- ? 匹配前面0个或1个字符
- {m} 匹配前面m个字符
- {m,n} 匹配前1个字符m至n次
- ^ 匹配以什么开头
- $ 匹配以什么结尾
- \A 匹配以什么开头
- \Z 匹配以什么结尾
- | 或 左右表达式取一个 ABC|def
- (..) 表示一个整体,(abc){2} 匹配abc2次
- (?P<name>)分组命名 比如(?P<name>tom)
- \(number) 引用编号为number的分组 比如:(\d)abc\1 1abc1
上述介绍了正则的一些基本语法。下面介绍的是re模块的常用方法。
一,re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re模块可以直接使用对应的方法,比如
- import re
- res = re.match('\d+','123abc123')
if res:
print(res.group())
这样就可以匹配到就是123,所以输出的则是123.
但是一般使用re模块的步骤通常是 将正则表达式的字符串编译为pattern实例,然后使用pattern实例处理文本并获得匹配结果,最后使用对应方法处理。通俗的就是要使用正则,先创建正则规则,然后编译成对象。最种使用正则的对应方法处理即可。
这样的好处就是速度更快。
所以上述代码更新为:
- import re
- pattern = re.compile('\d+')
- res = re.match(pattr, '123abc123')
- if res:
- print(res.group())
为了更直观的显示时间的区别,附上时间差的对比:
- import time
- import re
- def timeer(fun):
- def wrapper():
- start_time = time.time()
- fun()
- stop_time = time.time()
- print('{0}函数执行时间为{1}'.format(fun.__name__,stop_time-start_time))
- return wrapper
- @timeer
- def re_compile():
- pattern = re.compile('\d+')
- res = re.match(pattern, '123abc123')
- if res:
- print(res.group())
- @timeer
- def re_nocompile():
- res = re.match('\d+', '123abc123')
- if res:
- print(res.group())
- re_compile()
- re_nocompile()
上面的re.group()这里其实是可以填写对应的数值的。默认就是0,代表输出匹配到所有字符。
- import re
- pattern = re.compile('(\d+)([a-z]+)(\d+)')
- res = re.match(pattern,'123abc123')
- if res:
print(res.group(0))
print(res.group(1))
print(res.group(2))
print(res.group(3))
print(res.groups())
0 表示输出匹配到的所有,即默认所以输出的结果为123abc123
1 表示输出第一个括号匹配到的内容,即123
2表示输出第二个括号匹配到的内容,即abc
3表示输出第三个括号匹配到的内容,即123
groups() 返回所有小组匹配到的内容,以元祖的形式输出。即(123,abc,123)
切记:match是从第一字符开始匹配,如果匹配不到,直接返回None.
二,re.search
re.search 扫描整个字符串并返回第一个成功的匹配
- import re
pattern = re.compile('[a-z]+(\d+)(\w+)')- res = re.search(pattern,'123abc123_')
- if res:
print(res.group())
print(res.group(1))
print(res.group(2))- 输出结果:
abc123_
123
_
可以发现,即使search没有匹配到123,但是它还是会往后匹配,而不是直接返回none。再看如下代码:
- import re
- pattern = re.compile('[a-z]+')
- res = re.search(pattern,'123abc123abd')
- if res:
- print(res.group())
输出结果:abc
可见,search匹配整个字符串,找到第一个就会输出。后面的则不匹配。
简单小结:
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
三,re.findall 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。findall是没有group方法的。
- import re
- pattern = re.compile('[a-z]+')
- res = re.findall(pattern,'123abc123abd')
- print(res)
- 输出结果:['abc', 'abd']
可见该正则会将匹配到内容按列表的形式输出,它不仅仅是匹配一次,这个是它和search的区别
四, re.split 匹配分割字符串
- import re
- pattern = re.compile('[a-z]+')
- res = re.split(pattern,'123abc123abd')
- print(res)
- 输出结果:['123', '123', '']
五, re.sub 匹配替换
- import re
- pattern = re.compile('[a-z]+')
- res = re.sub(pattern,'000','123abc123')
- print(res)
- 输出结果:123000123
- line = '手机号:15200000000,生日:0802'
- reg_str1 = '.*:'
- reg_str2 = '.*?:'
- match_obj1 = re.match(reg_str1,line)
- match_obj2 = re.match(reg_str2,line)
- if match_obj1:
- print(match_obj1.group())
- if match_obj2:
- print(match_obj2.group())
- 输出结果:
- 手机号:15200000000,生日:
- 手机号:
- 可见,?是可以限制住*的贪婪匹配的!!!
- import re
- re = re.search('(?P<id>[0-9]+)(?P<name>[a-zA-Z]+)','abcd1233bob@34')
- if re:
- print(re.group())
- print(re.groupdict())
- 输出结果:
- 1233bob
- {'id': '1233', 'name': 'bob'}
- #比如匹配身份证,
- import re
- id = '360201199011113721'
- res = re.search('(?P<Province_code>[0-9]{2})(?P<City_code>[0-9]{2})(?P<County_code>[0-9]{2})(?P<birthday>[0-9]{8})(?P<policestation_id>[0-9]{2})(?P<sexid>[0-9]{1})(?P<checkid>[0-9]{1})',id)
- if res:
- print(res.group())
- print(res.groupdict())
- 输出结果:
- 360201199011113721
- {'Province_code': '36', 'City_code': '02', 'County_code': '01', 'birthday': '19901111', 'policestation_id': '37', 'sexid': '2', 'checkid': '1'}
python常用模块之re模块(正则)的更多相关文章
- Python常用内置模块之xml模块
xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示 ...
- Python常用的内建模块
PS:Python之所以自称“batteries included”,就是因为内置了许多非常有用的模块,无需额外安装和配置,即可直接使用.下面就来看看一些常用的内建模块. 参考原文 廖雪峰常用的内建模 ...
- Python常用数据结构之collections模块
Python数据结构常用模块:collections.heapq.operator.itertools collections collections是日常工作中的重点.高频模块,常用类型由: 计数器 ...
- Python常用数据结构之heapq模块
Python数据结构常用模块:collections.heapq.operator.itertools heapq 堆是一种特殊的树形结构,通常我们所说的堆的数据结构指的是完全二叉树,并且根节点的值小 ...
- python常用函数库及模块巧妙用法汇总
在用python编写脚本或写程序过程中总要遇到一些对大文件或数据进行排序,计算,循环跌代等.我想下面这些函数库一定能用得到,总结如下:便于以后备查 列表去重(传说是列表去重最高效的方法): al = ...
- python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则
python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess ...
- Python开发【第五章】:Python常用模块
一.模块介绍: 1.模块定义 用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质上就是.py结尾python文件 分类:内置模块.开源模块.自定义模块 2.导入模块 本质:导 ...
- Day05 - Python 常用模块
1. 模块简介 模块就是一个保存了 Python 代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块也是 Python 对象,具有随机的名字属性用来绑定或引用. 下例是个简单的模 ...
- Python第五章__模块介绍,常用内置模块
Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群 群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...
- 7.python常用模块
1.time 常用表示时间方式: 时间戳,格式化的时间字符串,元组(struct_time) UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时 ...
随机推荐
- LeetCode--No.005 Longest Palindromic Substring
5. Longest Palindromic Substring Total Accepted: 120226 Total Submissions: 509522 Difficulty: Medium ...
- java-Timer类使用方法
Timer: public Timer()创建一个新计时器.相关的线程不 作为守护程序运行. 方法摘要: void schedule(TimerTask task, Date time) ...
- 从零开始学 Web 之 DOM(五)元素的创建
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... +-------------------------------------------------------- ...
- redis-scala链接redis集群
代码: package com.wenbronk.sparkstreaming.scala.commons import java.time.Duration import io.lettuce.co ...
- 猪圈密码 摩斯密码 QWE加密 栅栏加密 当铺密码
1.猪圈密码 猪圈密码:对应下图就是HORSE 2.摩斯密码 在线摩斯密码翻译器:http://www.mathsking.net/morse.htm 3.QWE加密 键盘按ABC的顺序排列得到对应的 ...
- input type=file实现图片上传,预览以及图片删除
背景 前两天在做一个PC网站的意见反馈,其中涉及到了图片上传功能,要求可以上传多张图片,并且支持图片上传预览及图片删除, 图片上传这一块以前没怎么搞过,而且一般也很少会碰到这样的需求,所以在做这个功能 ...
- 【NET CORE微服务一条龙应用】应用部署
简介 系列目录:[NET CORE微服务一条龙应用]开始篇与目录 本章主要介绍https://github.com/q315523275/FamilyBucket上微服务一条龙应用,在实际使用中的应用 ...
- Mybatis缓存(1)--------系统缓存及简单配置介绍
前言 Mybatis的缓存主要有两种: 系统缓存,也就是我们一级缓存与二级缓存: 自定义的缓存,比如Redis.Enhance等,需要额外的单独配置与实现,具体日后主要学习介绍. 在这里主要记录系统缓 ...
- RIP笔记
RIP(工作中没见人用过这种古老的协议,了解一下距离矢量的思想即可) RIPv2支持VLSM但不支持CIDR RIP工作在应用层,用UDP封装,端口是520 无论是RIPv1还是RIPv2都既支持周期 ...
- Ajax之跨域请求
一.引子 我现在开启了两个django项目,分别叫Demo1和Demo2,Demo1中有一个路径‘http://127.0.0.1:8000/index/’,对应的视图是index视图返回一个inde ...