200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > python中match方法返回字符串的长度_Python re模块与正则表达式详解

python中match方法返回字符串的长度_Python re模块与正则表达式详解

时间:2019-06-03 06:24:27

相关推荐

python中match方法返回字符串的长度_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 pile方法;

Python中正则表达式执行过程:根据表达式编译生成Pattern对象,然后进行相关处理;

如果高频率使用一个固定的正则表达式,我们可以提前生成Pattern对象,提高效率。

compile方法:

import re

pile(pattern, flags=0) #pattern为正则表达式

参数:

pattern:正则表达式,是指为字符串;为了防止转义推荐使用原字符串(r'xxx');

flags:编译标志位,修改正则表达式的匹配方式,例如:大小写区分,换行处理等;

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

import re

pobj = pile(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)

输出结果:

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:-03-04',找到支付价格:2000;

分析:

1>支付前固定值:'pay:'

2>支付金额:数字字符串

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

s = 'pay:2000 date:-03-04'

#\d+:匹配数字一次或者多次

ma = re.search(r'pay:\d+', s)

print(ma)

输出结果:

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

s = 'pay:2000 date:-03-04'

#\d+:匹配数字一次或者多次,使用分组

ma = re.search(r'pay:(\d+)', s)

print(ma)

#获取分组1对应值

print(ma.group(1))

输出结果:

2000

5 re.findall/finditer方法

re.findall:在字符串中根据正则表达式查找所有匹配,返回查找结果组成列表;

re.finditer与findall功能相同,返回自迭代器;

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

练习:查找字符串中所有数字字符串,

例如:'pay:2000 date:-03-04' 查找数字结果:['2000', '', '03', '04']

实现如下:

import re

s = 'pay:2000 date:-03-04'

result = re.findall(r'\d+', s)

print(result)

结果为列表:['2000', '', '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)

输出结果:

'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'

8 flags标志位:

match,split等方法中都有一个标志位,主要设置值如下:

flag值

说明

re.I/re.IGNORECASE

匹配不区分大小写

re.L/re.LOCALE

\w, \W, \b, \B, \s and \S 依赖于本地

re.M/re.MULTILINE

多行匹配,对'^'与'$'有影响

re.S/re.DOTALL

使'.'特殊字符匹配任何字符

re.U/re.UNICODE

根据Unicode字符集解析字符。\w, \W, \b, \B, \d, \D, \s和 \S 取决于UNICODE定义的字符属性

re.X/re.VERBOSE

此标志允许您编写正则表达式,可添加注释

这些标志位可以结合使用,例如:re.M | re.S。

每个标志使用案例与对比如下:

re.I:匹配忽略大小写

ma = re.match(r'name:\w+', 'Name:sun age:10')

print(ma)

#添加re.I标志

ma = re.match(r'name:\w+', 'Name:sun age:10', re.I)

print(ma)

结果:

None

re.M:多行匹配

找到字符串中与户名

#注意,中间的换行\n

s = 'Name:sun age:10\nname:liu, age:9'

#正则表达式:每行开头开始匹配,默认处理第一行

result = re.findall(r'^name:\w+', s, re.I)

print(result)

输出结果:['Name:sun'];我们想要找到所有用户名?添加re.M,代码如下:

s = 'Name:sun age:10\nname:liu, age:9'

#re.I | re.M,支持设置多个标志位

result = re.findall(r'^name:\w+', s, re.I|re.M)

print(result)

结果:['Name:sun', 'name:liu']

re.S 修改'.'的行为

字符串:

what = 'I Say:"No!\nNo!"'

找出我说的话:"No!\nNo!"

匹配规则,双引号中间字符串,实现:

what = 'I Say:"No!\nNo!"'

ma = re.search(r'\".+\"', what)

print(ma)

输出结果:None;因为'.'不能匹配'\n',设置标志re.S,实现:

what = 'I Say:"No!\nNo!"'

ma = re.search(r'\".+\"', what, re.S)

print(ma)

输出结果:

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。