Python re模块与正则表达式详解

Python 中使用re模块处理正则表达式,正则表达式主要用来处理文本中的查找,匹配,替换,分割等问题;我们先来看一个问题,切入正则表达式。

问题:

匹配字符串,最少以3个数字开头。使用Python代码如何实现?
检查条件:

1>字符串长度判断;
2>判断前三个字符是否是数字;

这样实现起来有点啰嗦,我们可以使用正则表达式,先来看正则表达式基本语法。

1 正则表达式基本语法

.           匹配任意字符(不包括换行符)
^           匹配开始位置,多行模式下匹配每一行的开始
$           匹配结束位置,多行模式下匹配每一行的结束
*           匹配前一个元字符0到多次
+           匹配前一个元字符1到多次
?           匹配前一个元字符0到1次
{m,n}       匹配前一个元字符m到n次
\           转义字符,例如\.只能匹配.
[]          字符集,一个字符的集合,可匹配其中任意一个字符
\d          匹配一个数字, 相当于 [0-9]
\D          匹配非数字,相当于 [^0-9]
\s          匹配任意空白字符, 相当于 [ \t\n\r\f\v]
\S          匹配非空白字符,相当于 [^ \t\n\r\f\v]
\w          匹配数字、字母、下划线中任意一个字符, 相当于 [a-zA-Z0-9_]
\W          匹配非数字、字母、下划线中的任意字符,相当于 [^a-zA-Z0-9_]
|           逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b
(...)       分组

给一坨这个玩意,怎么用,都需要记住吗?
如果能记住就记住,如果很久不使用,就忘记吧;
等使用的时候直接查资料,理解能使用即可。
下面我们结合re模块,看正则表达式如何使用。

2 re.compile方法;

Python中正则表达式执行过程:根据表达式编译生成Pattern对象,然后进行相关处理;
如果高频率使用一个固定的正则表达式,我们可以提前生成Pattern对象,提高效率。

compile方法:

import re
re.compile(pattern, flags=0) #pattern为正则表达式

参数:
pattern:正则表达式,是指为字符串;为了防止转义推荐使用原字符串(r‘xxx‘);
flags:编译标志位,修改正则表达式的匹配方式,例如:大小写区分,换行处理等;

例子:匹配任意一个数字开头字符串:

import re
pobj = re.compile(r‘\d‘)
type(pobj)

输出结果:re.Pattern对象;
问题:如何来匹配呢?

3 re.match方法

re.match方法:从起始位置开始匹配,返回None或者re.Match对象;

#re模块match方法,参数:pattern:正则表达式,string:处理字符串
re.match(pattern, string, flags=0)
#re.Pattern对象中match方法,参数:string:处理字符串
re.Pattern.match(string, pos=0, endpos=...)

练习:匹配一个数字开头字符串:

import re
ma = re.match(r‘\d‘, ‘123‘)
print(ma)

输出结果:

<re.Match object; span=(0, 1), match=‘1‘>

match方法匹配过程:生成Pattern对象,然后进行匹配;
如何获取匹配结果?来看Match对象相关方法。

方法 说明
ma.end(group=0, /) 返回指定分组的结束位置
ma.start(group=0, /) 返回指定分组的开始位置
ma.span(group=0, /) 返回指定分组开始与结束位置
ma.group([group1, ...]) 返回字符串或者元组
ma.groups(default=None) 返回所有分组信息
groupdict([default=None]) 根据key获取分组信息

实际操作下,理解起来就容易了:

import re
import re
#正则表达式:匹配内容:数字+a~z+数字,并且进行分组
ma = re.match(r‘(\d)\w*(\d)‘, ‘1c3‘)
#匹配结果:‘1c3‘
print(‘group():‘, ma.group())
#获取指定分组:1
print(‘group(1):‘, ma.group(1))
#获取多个分组:(‘1‘, ‘3‘)
print(‘group(1,2):‘, ma.group(1,2))
#获取所有分组:(‘1‘, ‘3‘)
print(‘groups():‘, ma.groups())
#获取匹配结果索引:(0, 3)
print(‘span():‘, ma.span())
#获取指定分组索引:(0, 1)
print(‘span(1):‘,ma.span(1))

输出结果:

group(): 1c3
group(1): 1
group(1,2): (‘1‘, ‘3‘)
groups(): (‘1‘, ‘3‘)
span(): (0, 3)
span(1): (0, 1)

match方法只能用于从头匹配,如何在整个字符串中查找?
使用search方法。

4:re.search方法

search方法用于在字符串中查找,返回Match对象或者None;

search(pattern, string, flags=0);参数与match类似。

练习:查找第一次出现的数字组成的字串,例如:
在字符串:‘pay:2000 date:2019-03-04‘,找到支付价格:2000;
分析:

1>支付前固定值:‘pay:‘
2>支付金额:数字字符串

对应正则表达式逻辑:‘pay:‘+匹配数字直到非数字字符;具体实现:

s = ‘pay:2000 date:2019-03-04‘
#\d+:匹配数字一次或者多次
ma = re.search(r‘pay:\d+‘, s)
print(ma)

输出结果:

<re.Match object; span=(0, 8), match=‘pay:2000‘>

如何获取2000这个值?增加一个分组,代码实现:

s = ‘pay:2000 date:2019-03-04‘
#\d+:匹配数字一次或者多次,使用分组
ma = re.search(r‘pay:(\d+)‘, s)
print(ma)
#获取分组1对应值
print(ma.group(1))

输出结果:

<re.Match object; span=(0, 8), match=‘pay:2000‘>
2000

5 re.findall/finditer方法

re.findall:在字符串中根据正则表达式查找所有匹配,返回查找结果组成列表;
re.finditer与findall功能相同,返回自迭代器;

re.findall(pattern, string, flags=0) 

练习:查找字符串中所有数字字符串,
例如:‘pay:2000 date:2019-03-04‘ 查找数字结果:[‘2000‘, ‘2019‘, ‘03‘, ‘04‘]
实现如下:

import re
s = ‘pay:2000 date:2019-03-04‘
result = re.findall(r‘\d+‘, s)
print(result)

结果为列表:[‘2000‘, ‘2019‘, ‘03‘, ‘04‘];

6 re.split方法

re.split:字符串中根据正则表达式查找匹配字符串,然后进行切分,返回字串列表;

re.split(pattern, string, maxsplit=0, flags=0)
#maxsplit:切分次数,默认所有匹配都切分

练习:

info = ‘system:linux,  cpu:x64  memory 8G‘
整理格式:
dinfo = {‘system‘:‘linux‘, ‘cpu‘:‘x64‘, ‘memory‘:‘8G‘}

分析:

1>对info使用非字母,数字进行切分;
2>切分后将其整理成字典;

第一步切分:

info = ‘system:linux, cpu:x64 memory 8G‘
#正则表达式:\W+,匹配1个或多个
s = re.split(r‘\W+‘,info)
print(s)

切分结果:[‘system‘, ‘linux‘, ‘cpu‘, ‘x64‘, ‘memory‘, ‘8G‘];
第二步整理字典:

info = ‘system:linux, cpu:x64 memory 8G‘
s = re.split(r‘\W+‘,info)
dinfo = {}
for index in range(0, len(s), 2):
    dinfo[s[index]] = s[index+1]
print(dinfo)

输出结果:{‘system‘: ‘linux‘, ‘cpu‘: ‘x64‘, ‘memory‘: ‘8G‘}

7 re.sub与re.subn

re.sub与re.subn实现的字符串替换功能;

re.sub(pattern, repl, string, count=0, flags=0)
re.subn(pattern, repl, string, count=0, flags=0)

re.sub方法根据正则表达式将匹配子串替换成设置值并返回新字符串;参数如下:

主要参数 说明
pattern 正则表达式
repl 替换内容,可以是字符串或者函数
string 处理字符串
count 替换数量

re.subn与re.sub类似,返回替换数量与新字符串;

练习:

s  = "user:sun,pwd:222222",将密码:222222 替换为:******;

可以直接使用字符串替换方法:

s.replace(‘222222‘, ‘******‘)
#结果:‘user:sun,pwd:******‘

如果密码为不一样数字如何替换?例如:

s  = "user:sun,pwd:234567"

使用re.sub方法:

#将pwd:xxxx替换成******
re.sub(r‘pwd:(\d+)‘, "******", s)
#结果:‘user:sun,******‘

问题:pwd:去哪里了?如何处理?使用分组。

#pattern使用两个分组
#repl为原字符串,\1代表第一个分组内容,
re.sub(r‘(pwd:)(\d+)‘, r"\1******", s)

替换结果:

‘user:sun,pwd:******‘

大家可以理解下这个题目。

新的问题来了,一组考试成绩:

s = ‘math:90, chinese:90, english:50‘

大于等于60,替换成Pass,否则替换成Faild;推荐使用正则。

我们可以使用函数功能,先来看匹配分数,将其替换为空字符串;

re.sub(r‘\d+‘, ‘‘, s)

结果:‘math:, chinese:, english:‘;
我们将repl替换成函数,函数有一个参数,返回值为空字符串;

def func(arg):
    print(arg)
    return ‘‘
re.sub(r‘\d+‘, func, s)

输出结果:

<_sre.SRE_Match object; span=(5, 7), match=‘90‘>
<_sre.SRE_Match object; span=(17, 19), match=‘90‘>
<_sre.SRE_Match object; span=(29, 31), match=‘50‘>
‘math:, chinese:, english:‘

可以看到func中参数为每个匹配的match对象,我们可以获取这个值,并对其处理。

def func(arg):
    #获取分数
    score = int(arg.group())
    #重置返回结果
    if score <60:
        return ‘Faild‘
    return ‘Pass‘
re.sub(r‘\d+‘, func, s)

输出结果:

‘math:Pass, chinese:Pass, english:Faild‘

以上这些就是re模块常用使用方法及正则表达式基本语法,后面文章我们在介绍正则表达式更高级使用。

原文地址:https://blog.51cto.com/huangyg/2376894

时间: 2024-07-30 13:37:50

Python re模块与正则表达式详解的相关文章

python常用模块(1):collections模块和re模块(正则表达式详解)

从今天开始我们就要开始学习python的模块,今天先介绍两个常用模块collections和re模块.还有非常重要的正则表达式,今天学习的正则表达式需要记忆的东西非常多,希望大家可以认真记忆.按常理来说我们应该先解释模块概念性东西再来学习具体的模块使用.可是直接解释可能反而不好理解,模块的使用非常方便,所以我们采用先介绍使用常用模块过两天再具体进行模块概念的讲解. 预习: 实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998

python OptParse模块的用法详解

OptParse模块的简单介绍 Python 有两个内建的模块用于处理命令行参数: 一个是 getopt只能简单处理 命令行参数: 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posix 规范的命令行说明.会自动帮你负责-h帮助选项. 要自己定制程序的参数选项控制,可以使用python自带的OptParse模块,当然也可以直接解析sys.argv里的参数(但是此比较麻烦) import optparse optparse 现在不再更新了,更新版本叫

python正则表达式详解

python正则表达式详解 正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的.下面,我来介绍一下python中的正则表达式是怎么使用的. 首先,python中的正则表达式大致分为以下几部分: 元字符 模式 函数 re 内置对象用法 分组用

Python模块调用方式详解

Python模块调用方式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 原文地址:https://www.cnblogs.com/yinzhengjie/p/8586301.html

Python中 if __name__ == &#39;__main__&#39;: 详解

一个python文件就可以看作是一个python的模块,这个python模块(.py文件)有两种使用方式:直接运行和作为模块被其他模块调用. __name__:每一个模块都有一个内置属性__name__.而__name__的值取决与python模块(.py文件)的使用方式. 如果是直接运行,那么这个模块的__name__值就是“__main__”: 如果是作为模块被其他模块调用,那么这个模块(.py文件)的__name__值就是该模块(.py文件)的文件名,且不带路径和文件扩展名. 参考: ht

Java 正则表达式详解_正则表达式

body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;}

Python中的高级数据结构详解

这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考下 数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据结构,分别是List.Tuple.Dictionary以及Set.大部分的应用程序不需要其他类型的数据结构,但若是真需要也有很多高级数据结构可供选择

Python中的getattr()函数详解:

Python中的getattr()函数详解: getattr(object, name[, default]) -> value Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y. When a default argument is given, it is returned when the attribute doesn't exist; without it, an exception i

angular-ngSanitize模块-$sanitize服务详解

本篇主要讲解angular中的$sanitize这个服务.此服务依赖于ngSanitize模块. 要学习这个服务,先要了解另一个指令: ng-bing-html. 顾名思义,ng-bind-html和ng-bind的区别就是,ng-bind把值作为字符串,和元素的内容进行绑定,但是ng-bind-html把值作为html,和元素的html进行绑定.相当于jq里面的.text()和.html(). 但是,出于安全考虑,如果我们直接使用ng-bind-html是会报错的,ng-bind-html后面