正则表达式,说的简单些,就是一个匹配的功能,在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-正则基础的更多相关文章

  1. Python正则处理多行日志一例

    正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...

  2. Python爬虫基础

    前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...

  3. Python正则处理多行日志一例(可配置化)

    正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...

  4. 认识python正则模块re

    python正则模块re python中re中内置匹配.搜索.替换方法见博客---python附录-re.py模块源码(含re官方文档链接) 正则的应用是处理一些字符串,phthon的博文python ...

  5. Python正则表达式-基础

    Python正则表达式-基础 本文转载自昔日暖阳,原文地址:http://www.osheep.cn/4806.html python使用正则,需要先引入re模块 import re 匹配符 单个字符 ...

  6. 万门大学Python零基础10天进阶班视频教程

    点击了解更多Python课程>>> 万门大学Python零基础10天进阶班视频教程 课程简介: 旨在通过两周的学习,让学生不仅能掌握python编程基础从而进行计算机程序的开发, 还 ...

  7. Python正则式的基本用法

    Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2.re模块的基本函数 2.1使用compile加速 2.2 ma ...

  8. python 正则,常用正则表达式大全

    Nginx访问日志匹配 re.compile #re.compile 规则解释,改规则必须从前面开始匹配一个一个写到后面,前面一个修改后面全部错误.特殊标准结束为符号为空或者双引号:  改符号开始 从 ...

  9. python 正则使用笔记

    python正则使用笔记 def remove_br(content): """去除两边换行符""" content = content.r ...

  10. Python文件基础

    ===========Python文件基础========= 写,先写在了IO buffer了,所以要及时保存 关闭.关闭会自动保存. file.close() 读取全部文件内容用read,读取一行用 ...

随机推荐

  1. OkHttp完全解析之整体调用流程

    前言:阅读好的代码如同观赏美景一样的美妙 OkHttp是一个Square公司在github开源的Java网络请求框架,非常流行.OkHttp 的代码并不是特别庞大,代码很多巧妙的实现,非常值得学习. ...

  2. linux 安装php扩展swoole redis

    本文讲的是已经有redis.so 和swoole.so文件的情况 我的环境是xampp php的扩展目录为 /opt/lampp/lib/php/extensions/no-debug-non-zts ...

  3. [转]Shared——Javascript中的call详解

    call( ) 一.call的使用 call 方法第一个参数是作为函数上下文的对象,第二个参数是一个参数列表. var obj = { name: 'J' } function func(p1, p2 ...

  4. BZOJ4773: 负环(倍增Floyd)

    题意 题目链接 Sol 倍增Floyd,妙妙喵 一个很显然的思路(然而我想不到是用\(f[k][i][j]\)表示从\(i\)号点出发,走\(k\)步到\(j\)的最小值 但是这样复杂度是\(O(n^ ...

  5. vue-router 的使用

    vue-router 是 vue  的  一个特色. 下面介绍vue-router 的使用: 一.先将vue-router作为vue 的一个插件使用 import Vue from 'vue' imp ...

  6. MySQL数据库、表的字符编码

    用MySQL命令行新建数据库和表时默认的字符编码是latin1,但是在实际开发过程中一般都是使用utf8格式的编码.操作如下: 1.修改数据库字符编码 mysql> alter database ...

  7. linux父子进程问题

    今天遇到一个linux进程启动时指定Max open files不对的问题,导致程序建立socket异常,进而导致fullgc问题,影响正常服务.所以顺带又温习了下linux下的父子进程的特性. 孤儿 ...

  8. Python爬虫教程-12-爬虫使用cookie爬取登录后的页面(人人网)(上)

    Python爬虫教程-12-爬虫使用cookie(上) 爬虫关于cookie和session,由于http协议无记忆性,比如说登录淘宝网站的浏览记录,下次打开是不能直接记忆下来的,后来就有了cooki ...

  9. bitekind

    xrp这个人到SNT家坐在IOST的椅子上,喝着THETA. 武之巅峰,是孤独,是寂寞,是漫漫求索,是高处不胜寒    逆境中成长,绝地里求生,不屈不饶,才能堪破武之极道.    凌霄阁试炼弟子兼扫地 ...

  10. 通过游戏学敏捷:只通过Specification来传递需求

    转自:https://mp.weixin.qq.com/s/jAYbAMUTNYGh4RxGPAZ1AQ 活动把每个小组(4-5个人)中的2人留在屋子里,其他人到屋子外面等待.在屋子里的人,会得到一张 ...