re模块的基本使用
re模块
re模块 , 即正则表达式 , 本身是一种小型的、高度专业化的编程语言,它并不是Python的一部分
re模块的作用就是: 从大的字符串中挑选出 具有某种形状特点的字符串
常用元字符
^ : 以..开头
s = 'abcdabc'
res = re.findall('^ab', s)
print(res)  
# ['ab']
$ : 以..结尾
s = 'abcdabc'
res = re.findall('bc$', s)
print(res)  
# ['bc']
. : 任意字符
s = 'abc红abc'
res = re.findall('abc.', s)
print(res)  
# ['abc红']
\d : 数字
s = 'skld2342ljk'
res = re.findall('\d', s)
print(res)  
# ['2', '3', '4', '2']
\D : 非数字
s = 'skld2342ljk'
res = re.findall('\D', s)
print(res)
# ['s', 'k', 'l', 'd', 'l', 'j', 'k']
\w : 非空字符,即数字字母下划线
s = 'skld_2你3 42ljk'
res = re.findall('\w', s)
print(res)
# ['s', 'k', 'l', 'd', '_', '2', '你', '3', '4', '2', 'l', 'j', 'k']
**\W : 空字符,包括空格 换行 **
s = 'skld_23 42ljk'
res = re.findall('\W', s)
print(res)
# [' ']
\s : 空字符,包括空格 换行
s = 'skld_23 42ljk'
res = re.findall('\s', s)
print(res)
# [' ']
\S : 非空字符,即数字字母下划线
s = 'skld_23 42ljk'
res = re.findall('\S', s)
print(res)
# ['s', 'k', 'l', 'd', '_', '2', '3', '4', '2', 'l', 'j', 'k']
+ : 前面的一个字符至少1个 [1,正无穷)
s = 'abcddabdabcdd abcd abc'
print(re.findall('abcd+', s))
# ['abcdd', 'abcdd', 'abcd']
?:前面的一个字符0-1个 前一个字符[0,1] 最大只有一个
s = 'abcddddd abcd abc ab'
print(re.findall('abcd?', s))
# ['abcd', 'abcd', 'abc']
*** :前面的一个字符至少0个 前一个字符[0,正无穷)**
s = 'abcddddd abcd abc ab'
print(re.findall('abcd*', s))
# ['abcddddd', 'abcd', 'abc']
[] : 中括号内的都可以 , 但是只占一个位置
s = 'abc bbc cbc dbc abcd '
print(re.findall('[abc]bc', s))
# ['abc', 'bbc', 'cbc', 'abc']
[^] : 中括号的都不可以
s = 'abc bbc cbc dbc'
print(re.findall('[^abc]bc', s))
# ['dbc']
|:或 满足就打印 , 一个或者两个三个
s = 'abc bbd dbc'
print(re.findall('abc|bbc', s))
# ['abc']
{2}:前面的字符重复2个
s = 'abccabc abccc'
print(re.findall('abc{2}', s))
# ['abcc', 'abcc']
{1,2}:前面的字符重复1-2个 区间是[1,2]
s = 'abccabc abccc'
print(re.findall('abc{1,2}', s))
# ['abcc', 'abc', 'abcc']
特殊构造
a(?=\d) :a后面是数字,但是不要数字,不消耗字符串内容
s = 'a123 aaaa a234 abc'
#    a1   aa
#          aa
#           aa
#               a2  ab
print(re.findall('a(?=\d)', s))
# ['a', 'a']
print(re.findall('a(?=\w)', s))
# ['a', 'a', 'a', 'a', 'a', 'a']
贪婪模式
Python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符 , 一定要找到最后 才停止
.(任意字符)*(0-无穷个)
s = 'abcdefgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbg'
print(re.findall('a.*g', s))
# ['abcdefgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbg']
非贪婪模式
非贪婪的则相反,总是尝试匹配尽可能少的字符 , 找到一个就停止并返回
.(任意字符)*(0-无穷个)?(让他进入非贪婪模式)
s = 'abcdefgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbg'
print(re.findall('a.*?g', s))
# ['abcdefg']
re的常用函数
findall:最常用 推荐使用 直接在函数内部书写匹配规则
import re
a = re.findall("匹配规则", "这个字符串是否有匹配规则的字符")
print(a)
compile:写一个特定的规则模板
# 定义邮箱、手机号匹配规则,直接调用
email_pattern = re.compile('\w+@\w+.com')
phone_patter = re.compile('\d{13}')
print(re.findall(email_pattern, s))
match: 从字符串开头找一个,找得到就不找了 ;找不到报错
s = 'ab abcddd abc'
res = re.match('abcd*', s)
print(res.group())
search: 搜索,从整个内容中匹配,只找一个,找不到报错
s = 'ab abcddd abc'
res = re.search('abcd*', s)
print(res.group())
split 切割,相当于字符串的split
s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
print(re.split('\d+', s))
# ['ab', 'abcddd', 'abcasdfjlasjdk', 'l', 'lk', 'j', 'kl', 'kl', 'k', 'j', 'kl', 'j', 'lkj']
sub 替换,相当于字符串的replace
s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
print(re.sub('\d+', ' ', s))
# ab abcddd abcasdfjlasjdk l lk j kl kl k j kl j lkj
subn 替换,会返回替换的次数
s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
print(re.subn('\d+', ' ', s))
# ('ab abcddd abcasdfjlasjdk l lk j kl kl k j kl j lkj', 12)
re模块补充
re.S 会让.匹配换行符
a = '''asdfhellopass:
    worldaf
    '''
b = re.findall('hello(.*?)world', a)
c = re.findall('hello(.*?)world', a, re.S)
print(b)
# []
print(c)
# ['pass:\n    ']
. 不匹配换行
s = '''abc
abcabc*abc
'''
print(re.findall('abc.abc', s))
# ['abc*abc']
print(re.findall('abc.abc', s, re.S))
# ['abc\nabc', 'abc*abc']
分组 --> 只要括号里的(...)
s = 'abc abcd abcdd'
print(re.findall('a(.)c(d)', s))
# [('b', 'd'), ('b', 'd')]
有名分组
s = 'abc abcd abcdd'
print(re.search('a(?P<name>.)c(?P<name2>d)', s).groupdict())
# {'name': 'b', 'name2': 'd'}
关于re模块必须知道的知识点
- .*? :
 
非贪婪匹配
贪婪和非贪婪:
贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配
非贪婪匹配(?):在满足匹配时,找到一个就停止,返回结果
findall:
findall(pattern, string, flags=0)浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中,未匹配成功返回空列表re.S:
表示 “.” 的作用扩展到整个字符串,包括“\n”。
match和sarch的区别:
match()函数只在string的开始位置匹配,找不到就报错
search()会扫描整个string查找匹配,会扫描整个字符串并返回第一个成功的匹配结果分组:
()表示分组,可以与 | 合用,(ab|cd)表示匹配字符 ab 或 字符 cd
有名分组:
?P<name># ?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容(只对正则函数返回对象时有用)
re模块的基本使用的更多相关文章
- npm 私有模块的管理使用
		
你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...
 - node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
		
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
 - ES6模块import细节
		
写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...
 - Python标准模块--ContextManager
		
1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...
 - Python标准模块--Unicode
		
1 模块简介 Python 3中最大的变化之一就是删除了Unicode类型.在Python 2中,有str类型和unicode类型,例如, Python 2.7.6 (default, Oct 26 ...
 - Python标准模块--Iterators和Generators
		
1 模块简介 当你开始使用Python编程时,你或许已经使用了iterators(迭代器)和generators(生成器),你当时可能并没有意识到.在本篇博文中,我们将会学习迭代器和生成器是什么.当然 ...
 - 自己实现一个javascript事件模块
		
nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向 ...
 - 理解nodejs模块的scope
		
描述 原文档地址:https://docs.npmjs.com/misc/scope 所有npm模块都有name,有的模块的name还有scope.scope的命名规则和name差不多,同样不能有ur ...
 - nodejs模块发布及命令行程序开发
		
前置技能 npm工具为nodejs提供了一个模块和管理程序模块依赖的机制,当我们希望把模块贡献出去给他人使用时,可以把我们的程序发布到npm提供的公共仓库中,为了方便模块的管理,npm规定要使用一个叫 ...
 - 开始学nodejs——net模块
		
net模块的组成部分 详见 http://nodejs.cn/api/net.html 下面整理出了整个net模块的知识结构,和各个事件.方法.属性的用法 net.Server类 net.Socket ...
 
随机推荐
- 最新2019Pycharm安装破解教程!内附破解码!
			
本教程仅用作个人学习,请勿用于商业获利,造成后果自负!!! Pycharm安装 在这插一个小话题哈,Pycharm只是一个编译器,并不能代替Python,如果要使用Python,还是需要安装Pytho ...
 - 窥见云技术未来大势,腾讯云Techo开发者大会即将在京召开
			
云.物联网.5G.人工智能……一项项技术的突破带来了天翻地覆的变化,开发者们是如何一次次地进行天马行空的创意和极限突破?2019年11月6日-7日,由腾讯云主办的首届Techo开发者大会将在北京嘉里大 ...
 - Jenkins项目构建
			
一:新建项目 (1)点击新建,输入项目名称--构建一个自由风格的软件项目,点击ok (2)创建项目名称,选择节点标签 (3)构建触发器-----设置每两分钟执行一次 其中有5个参数 (*****) 第 ...
 - Qt5教程: (4) 带参数信号与槽
			
在subwidget.h中声明一个signal. 和之前的信号函数重名但是有参数: void backSignal(QString); 之后在subwidget.cpp的槽函数sendSignal() ...
 - Java学习笔记之基础语法(数组)
			
数组 数组概述:是具有相同数据类型的数据的集合 数组的定义:数据类型 数组名 [] 数组特点: 1,数组是引用数据类型. 2,数组值用大括号,元素之间用逗号隔开,元素的个数是0-N个 3,数组长度是固 ...
 - 渗透系统虚拟机----win7(渗透工具包)
			
今天把自己用的win7渗透虚拟机和渗透工具脚本整合到一起备份传网盘了: D:\渗透工具包>dir 驱动器 D 中的卷是 DATA 卷的序列号是 0D74-084B D:\渗透工具包 的目录 // ...
 - [Luogu2593] [ZJOI2006]超级麻将
			
题目地址 :https://www.luogu.org/problemnew/show/P2593. 无脑DP(虽说是抄的额) #include <iostream> #include & ...
 - openssl生成密钥/证书
			
一.公钥/私钥/签名/验证签名/加密/解密/非对称加密 对称加密:用同一个密码 加密/解密 文件. 非对称加密:加密用的一个密码,解密用另外一组密码. 加密解密:公钥加密数据,然后私钥解密. 公钥 ...
 - 解决git报错“The file will have its original line endings in your working directory”的方法
			
在执行命令 git commit --all -m '说明' 时报错“The file will have its original line endings in your working dir ...
 - 玩转OneNET物联网平台之HTTP服务① —— 模拟上传温度(TcpClient)
			
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...