python-正则基础
正则表达式,说的简单些,就是一个匹配的功能,在python中,只要引用 re 模块,就能进行正则匹配操作
一、math匹配
先来看一个简单的例子
import re
re.match(pattern, data_source) #math为匹配,pattern为需要匹配的对象,data_source为数据源
查看下匹配的结果
import re
a = re.match('abc', 'abcdefg')
b = re.match('abc', 'bcdefg')
print(a)
print(b) -----结果-----
<_sre.SRE_Match object; span=(0, 3), match='abc'> #a为匹配到的结果,返回的是一个正则的对象
None #b为没匹配到的结果
查看匹配到的具体结果,需要使用group方法:
import re
a = re.match('abc', 'abcdefg')
print(a.group()) -----结果-----
abc
需要注意的是,math只能从字符串开头进行匹配
import re
a = re.match('abc', 'aabcdefg')
if a:
print('匹配成功')
else:
print('匹配失败') -----结果-----
匹配失败
在math中除了有group方法查看匹配到的内容外,还有以下几个方法:
import re
a = re.match('abc', 'abcdefg')
print(a.start()) #查看匹配开始的位置
print(a.end()) #查看匹配结束的位置
print(a.span()) #查看匹配开始和结束的位置 -----结果-----
0
3
(0, 3)
如果想要匹配任意数字,可以这样写:
import re
a = re.match('[0-9]', '1234abc') #[0-9]为匹配任意一个数字
b = re.match('[0-9]{1,9}', '1234abc') #[0-9]{1,9}为匹配任意1到9个数字
print(a.group())
print(b.group()) -----结果-----
1
1234
在上面的例子中,我们进行了两次匹配,在匹配的过程中,先需要对匹配的对象进行编译,如果多次匹配时的对象都是相同的,那也会进行多次编辑,这就造成了一定程度上的资源浪费,为了提升匹配效率,我们可以这样写:
import re p = re.compile('[0-9]') #先对匹配对象进行编译
a = p.match('1234aBc') #第一次匹配开头为数字
b = p.match('56abc') #第二次匹配开头为数字
print(a.group())
print(b.group())
二、search
在上文中介绍了math,math是只能从开头进行匹配,如果想从整个字符串的任意位置进行匹配,我们可以使用search:
import re
a = re.search('\d', 'b1234abc123') #\d为匹配任意十进制数,相当于[0-9]
print(a.group()) -----结果-----
1
需要注意的是,search只要是匹配到了内容,后面的内容就不会进行匹配了
三、findall
findall方法能够以列表的形式返回能匹配的子串,看例子:
import re
a = re.findall('[0-9]', '1234abc123')
b = re.findall('[0-9]{0,9}', '1234abc123')
c = re.findall('[0-9]{1,9}', '1234abc123')
print(a)
print(b)
print(c) -----结果-----
['1', '2', '3', '4', '1', '2', '3']
['1234', '', '', '', '123', ''] #由于{0,9}是可以匹配到0个数字,因此最终的结果中会匹配到空的字符串
['1234', '123'] #改为{1,0}后,就无法匹配到0个数字啦
四、sub和subn
之前介绍的几个方法中,只能查看到匹配的结果,如果我们想把匹配到的内容换成另外的内容,就可以使用sub和subn,就是通常意义上的替换
import re
a = re.sub('a', 'z', 'b1234abc123aaa') #把a换成z
b = re.subn('a', 'z', 'b1234abc123aaa')
print(a)
print(b) -----结果-----
b1234zbc123zzz
('b1234zbc123zzz', 4) #使用subn时,会统计到匹配的次数
如果想要指定替换的次数,可以参入count的参数
import re
a = re.sub('a', 'z', 'b1234abc123aaa', count=1)
b = re.subn('a', 'z', 'b1234abc123aaa', count=1)
print(a)
print(b) -----结果-----
b1234zbc123aaa
('b1234zbc123aaa', 1)
五、split
split表示在匹配时对字符串进行分割,分割完后存入一个列表中
import re
a = re.split('[0-9]', 'xiaohong1xiaosun')
print(a) -----结果-----
['xiaohong', 'xiaosun']
六、正则表达式
元字符 | 说明 |
---|---|
. | 代表任意字符 |
| | 逻辑或操作符 |
[ ] | 匹配内部的任一字符或子表达式 |
[^] | 对字符集和取非 |
- | 定义一个区间 |
\ | 对下一字符取非(通常是普通变特殊,特殊变普通) |
* | 匹配前面的字符或者子表达式0次或多次 |
*? | 惰性匹配上一个 |
+ | 匹配前一个字符或子表达式一次或多次 |
+? | 惰性匹配上一个 |
? | 匹配前一个字符或子表达式0次或1次重复 |
{n} | 匹配前一个字符或子表达式 |
{m,n} | 匹配前一个字符或子表达式至少m次至多n次 |
{n,} | 匹配前一个字符或者子表达式至少n次 |
{n,}? | 前一个的惰性匹配 |
^ | 匹配字符串的开头 |
\A | 匹配字符串开头 |
$ | 匹配字符串结束 |
[\b] | 退格字符 |
\c | 匹配一个控制字符 |
\d | 匹配任意数字 |
\D | 匹配数字以外的字符 |
\t | 匹配制表符 |
\w | 匹配任意数字字母下划线 |
\W | 不匹配数字字母下划线 |
python-正则基础的更多相关文章
- Python正则处理多行日志一例
正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...
- Python爬虫基础
前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...
- Python正则处理多行日志一例(可配置化)
正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...
- 认识python正则模块re
python正则模块re python中re中内置匹配.搜索.替换方法见博客---python附录-re.py模块源码(含re官方文档链接) 正则的应用是处理一些字符串,phthon的博文python ...
- Python正则表达式-基础
Python正则表达式-基础 本文转载自昔日暖阳,原文地址:http://www.osheep.cn/4806.html python使用正则,需要先引入re模块 import re 匹配符 单个字符 ...
- 万门大学Python零基础10天进阶班视频教程
点击了解更多Python课程>>> 万门大学Python零基础10天进阶班视频教程 课程简介: 旨在通过两周的学习,让学生不仅能掌握python编程基础从而进行计算机程序的开发, 还 ...
- Python正则式的基本用法
Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2.re模块的基本函数 2.1使用compile加速 2.2 ma ...
- python 正则,常用正则表达式大全
Nginx访问日志匹配 re.compile #re.compile 规则解释,改规则必须从前面开始匹配一个一个写到后面,前面一个修改后面全部错误.特殊标准结束为符号为空或者双引号: 改符号开始 从 ...
- python 正则使用笔记
python正则使用笔记 def remove_br(content): """去除两边换行符""" content = content.r ...
- Python文件基础
===========Python文件基础========= 写,先写在了IO buffer了,所以要及时保存 关闭.关闭会自动保存. file.close() 读取全部文件内容用read,读取一行用 ...
随机推荐
- redis操作基本命令
Redis—— Remote Dictionary Server,它是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API,我们 ...
- Java接口和抽象类理解(New)
一. 抽象类和接口的特点 包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法.注意,抽象类和普通类的主要有三点区别: 1)抽象方法必 ...
- Cocos2d-js 开发记录:骨骼动画载入
不得不说cocos2d-js的文档实在是少,骨骼动画的载入和C++版本的好像还有些不同不能直接依样画葫芦. 一个由cocos studio编辑生成的骨骼动画一般会包含如下几个文件: .ExportJs ...
- K2P刷机教程转自恩山磨人的小妖精
K2P刷机指南说明 K2P MTK版发布之初用的是22.5.7.85, 这个版本官改和高恪K2P固件都可以从斐讯固件基础上直接升级, 是所谓直刷.但好景不长, 之后的版本比如22.5.17.33就改了 ...
- phpmyadmin数据表结构没有显示注释列
新开的一个项目,用phpmyadmin作为图形化操作数据库工具.创建数据表时为其每列添加好注释,浏览数据表内容有显示注释内容,但是查看数据表结构没有显示注释列,不方便直观查看数据表每列的意思. 上网搜 ...
- javascript多浏览器的兼容
一.document.formName.item(”itemName”) 问题 问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document. ...
- FeatureLayer 里属性数据的提取与显示
我们用工程文件所发布的WebServer下,包含一个个图层,这些图层根据顺序进行了 0 开始的编号,这些就是FeatureLayer的地址了! FeatureLayer 包含了地图的属性信息,十分好用 ...
- 02_zookeeper配置
[zoo.cfg] * tickTime:用于计算的时间单元.比如session超时:N*tickTime * initLimit:用于集群,允许从节点连接并且同步到master节点的初始化连接时间, ...
- 01_Zookeeper简述
[Zookeeper应用场景] zookeeper作为一个开源的分布式应用协调系统,已经用到了许多分布式项目中,用来完成统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等工作. [Zook ...
- 电脑护眼小软件f.lux
f.lux这软件用了能不能保护好视力不好说,反正我是用了以后这么多年一直都在用,狠不下心删去.至少安装后能让心里多一些安全感! 以前老控制不住长期坐在电脑前不动,太需要有这类软件来养护.用了没太明显的 ...