正则表达式,说的简单些,就是一个匹配的功能,在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. asp.net Core2.1连接到Mysql 数据库

    1.首先,安装相关插件 在nuget下安装 1.Pomelo.EntityFrameworkCore.MySql 2.MySql.Data.EntityFrameworkCore 都要是2.1 < ...

  2. docker容器启动时执行脚本 run /bin/bash执行多条指令

    搜了很多资料发现并未解决,以下方法失败!求大神评论给出完美方案 1.首先需要编写需要启动的脚本,并将脚本放在 /etc/init.d/目录下 如:cs.sh 2.修改权限 3.chkconfig -- ...

  3. Python之异常设计(一)

    一 定义 异常分为两类:一类是自动触发异常如除零错误:另一类是通过raise触发. 二 为什么要使用异常 当程序运行时,如果检测到程序错误,Python就会引发异常,我们可以在程序中使用try语句捕获 ...

  4. Live2D 博客页面添加板娘

    偶然看到了live2d,神奇的二次元呀 在页脚Html代码中添加如下代码即可: <link rel="stylesheet" type="text/css" ...

  5. 子div设置float后会导致父div无法自动撑开

    本文是从简书复制的, markdown语法可能有些出入, 想看"正版"和更多内容请关注 简书: 小贤笔记 注: 文章部分转载 彩泉 - 博客园 原因:内部的DIV因为float:l ...

  6. How to use DBVisualizer to connect to Hbase using Apache Phoenix

    How to use DBVisualizer to connect to Hbase using Apache Phoenix Article DB Visualizer is a popular ...

  7. webgis开发-开始向JS转向

    官方的一个blog Final Release and Support Plan for the ArcGIS APIs / Viewers for Flex and Silverlight 网址: ...

  8. Winform访问本地SQLServer数据库文件

    Winform访问本地SQLServer数据库文件 1.项目中添加config配置,如下: <configuration> <connectionStrings> <ad ...

  9. tcp三次握手和四次挥手(2)

      背景描述 通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之间的通信.但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进 ...

  10. jquery实用技巧之输入框提示语句

    我们在编写网页的时候不可避免的会遇到输入框,那么怎么设计输入框才能更加优雅呢?不同的人会有不同的答案,下面分享一个比较不错的设计. 效果图 细节 这个效果主要是通过JQuery来实现,我的思路如下: ...