天涯论坛

 找回密码
 立即注册
搜索
查看: 36|回复: 5

Python 正则表达式

[复制链接]

2966

主题

144

回帖

9912万

积分

论坛元老

Rank: 8Rank: 8

积分
99129182
发表于 2024-8-18 11:42:32 | 显示全部楼层 |阅读模式

正则表达式是一个特殊的字符序列,它能帮忙你方便的检测一个字符串是不是与某种模式匹配。

Python 自1.5版本起增多了re 模块,它供给 Perl 风格的正则表达式模式。

re 模块使 Python 语言持有所有的正则表达式功能。

compile 函数按照一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象持有一系列办法用于正则表达式匹配和替换。

re 模块供给了与这些办法功能完全一致的函数,这些函数运用一个模式字符串做为它们的第1个参数。

本章节重点介绍Python中常用的正则表达式处理函数。

更加多精彩能够点赞+关注私信我

re.match函数

re.match 尝试从字符串的初始位置匹配一个模式,倘若不是初始位置匹配成功的话,match()就返回none。

函数语法

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

函数参数说明:

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.match(www, www.runoob.com).span()) # 在初始位置匹配 print(re.match(com, www.runoob.com)) # 不在初始位置匹配

以上实例运行输出结果为:

(0, 3) None

实例

#!/usr/bin/python import re line = "Cats are smarter than dogs" matchObj = re.match( r(.*) are (.*?) .*, line, re.M|re.I) if matchObj: print "matchObj.group() : ", matchObj.group() print "matchObj.group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2) else: print "No match!!"

以上实例执行结果如下:

matchObj.group() : Cats are smarter than dogs matchObj.group(1) : Cats matchObj.group(2) : smarter

re.search办法

re.search 扫描全部字符串并返回第1个成功的匹配。

函数语法:

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

函数参数说明:

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.search(www, www.runoob.com).span()) # 在初始位置匹配 print(re.search(com, www.runoob.com).span()) # 不在初始位置匹配

以上实例运行输出结果为:

(0, 3) (11, 14)

实例

#!/usr/bin/python import re line = "Cats are smarter than dogs"; searchObj = re.search( r(.*) are (.*?) .*, line, re.M|re.I) if searchObj: print "searchObj.group() : ", searchObj.group() print "searchObj.group(1) : ", searchObj.group(1) print "searchObj.group(2) : ", searchObj.group(2) else: print "Nothing found!!"

以上实例执行结果如下:

searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats searchObj.group(2) : smarter

re.match与re.search的区别

re.match只匹配字符串的起始倘若字符串起始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配全部字符串,直到找到一个匹配。

实例

#!/usr/bin/python import re line = "Cats are smarter than dogs"; matchObj = re.match( rdogs, line, re.M|re.I) if matchObj: print "match --> matchObj.group() : ", matchObj.group() else: print "No match!!" matchObj = re.search( rdogs, line, re.M|re.I) if matchObj: print "search --> searchObj.group() : ", matchObj.group() else: print "No match!!"

以上实例运行结果如下:

No match!! search --> searchObj.group() : dogs

检索和替换

Python 的 re 模块供给了re.sub用于替换字符串中的匹配项。

语法:

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

参数:

pattern : 正则中的模式字符串。repl : 替换的字符串,可为一个函数。string : 要被查询替换的原始字符串。count : 模式匹配后替换的最大次数,默认 0 暗示替换所有的匹配。

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- import re phone = "2004-959-559 # 这是一个国外tel号码" # 删除字符串中的 Python注释 num = re.sub(r#.*$, "", phone) print "tel号码是: ", num # 删除非数字(-)的字符串 num = re.sub(r\D, "", phone) print "tel号码是 : ", num

以上实例执行结果如下:

tel号码是: 2004-959-559 tel号码是 : 2004959559

repl 参数是一个函数

以下实例中将字符串中的匹配的数字乘以 2:

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- import re # 将匹配的数字乘以 2 def double(matched): value = int(matched.group(value)) return str(value * 2) s = A23G4HFD567 print(re.sub((?P<value>\d+), double, s))

执行输出结果为:

A46G8HFD1134

re.compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数运用

语法格式为:

re.compile(pattern[, flags])

参数:

pattern : 一个字符串形式的正则表达式flags : 可选,暗示匹配模式,例如忽略体积写,多行模式等,详细参数为:re.I 忽略体积re.L 暗示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境re.M 多行模式re.S即为. 并且包含换行符在内的任意字符(.包含换行符)re.U 暗示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库re.X 为了增多可读性,忽略空格和 # 后面的注释

实例

实例

>>>import re >>> pattern = re.compile(r\d+) # 用于匹配最少一个数字 >>> m = pattern.match(one12twothree34four) # 查询头部,匹配 >>> print m None >>> m = pattern.match(one12twothree34four, 2, 10) # 从e的位置开始匹配,匹配 >>> print m None >>> m = pattern.match(one12twothree34four, 3, 10) # 从1的位置起始匹配,正好匹配 >>> print m # 返回一个 Match 对象 <_sre.SRE_Match object at 0x10a42aac0> >>> m.group(0) # 可省略 0 12 >>> m.start(0) # 可省略 0 3 >>> m.end(0) # 可省略 0 5 >>> m.span(0) # 可省略 0 (3, 5)

在上面,当匹配成功时返回一个 Match 对象,其中:

group([group1, …]) 办法用于得到一个或多个分组匹配的字符串,当要得到全部匹配的子串时,可直接运用 group() 或 group(0);start([group]) 办法用于获取分组匹配的子串在全部字符串中的初始位置(子串第1个字符的索引),参数默认值为 0;end([group]) 办法用于获取分组匹配的子串在全部字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;span([group]) 办法返回 (start(group), end(group))。

瞧瞧一个例子:

实例

>>>import re >>> pattern = re.compile(r([a-z]+) ([a-z]+), re.I) # re.I 暗示忽略体积写 >>> m = pattern.match(Hello World Wide Web) >>> print m # 匹配成功,返回一个 Match 对象 <_sre.SRE_Match object at 0x10bea83e8> >>> m.group(0) # 返回匹配成功的全部子串 Hello World >>> m.span(0) # 返回匹配成功的全部子串的索引 (0, 11) >>> m.group(1) # 返回第1个分组匹配成功的子串 Hello >>> m.span(1) # 返回第1个分组匹配成功的子串的索引 (0, 5) >>> m.group(2) # 返回第二个分组匹配成功的子串 World >>> m.span(2) # 返回第二个分组匹配成功的子串 (6, 11) >>> m.groups() # 等价于 (m.group(1), m.group(2), ...) (Hello, World) >>> m.group(3) # 不存在第三个分组 Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: no such group

findall

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,倘若找到匹配的,则返回空列表。

重视 match 和 search 是匹配一次 findall 匹配所有。

语法格式为:

findall(string[, pos[, endpos]])

参数:

string : 待匹配的字符串。pos : 可选参数,指定字符串的初始位置,默认为 0。endpos: 可选参数,指定字符串的结束位置,默认为字符串的长度。

查询字符串中的所有数字:

实例

# -*- coding:UTF8 -*- import re pattern = re.compile(r\d+) # 查询数字 result1 = pattern.findall(runoob 123 google 456) result2 = pattern.findall(run88oob123google456, 0, 10) print(result1) print(result2)

输出结果:

[123, 456] [88, 12]

re.finditer

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们做为一个迭代器返回。

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

实例

# -*- coding: UTF-8 -*- import re it = re.finditer(r"\d+","12a32bc43jf3") for match in it: print (match.group() )

输出结果:

12 32 43 3

re.split

split 办法根据能够匹配的子串将字符串分割后返回列表,它的运用形式如下:

re.split(pattern, string[, maxsplit=0, flags=0])

实例

>>>import re >>> re.split(\W+, runoob, runoob, runoob.) [runoob, runoob, runoob, ] >>> re.split((\W+), runoob, runoob, runoob.) [, , runoob, , , runoob, , , runoob, ., ] >>> re.split(\W+, runoob, runoob, runoob., 1) [, runoob, runoob, runoob.] >>> re.split(a*, hello world) # 针对一个找不到匹配的字符串而言,split 不会对其作出分割 [hello world]

正则表达式对象

re.RegexObject

re.compile() 返回 RegexObject 对象。

re.MatchObject

group() 返回被 RE 匹配的字符串。

start() 返回匹配起始的位置end() 返回匹配结束的位置span() 返回一个元组包括匹配 (起始,结束) 的位置

正则表达式修饰符 - 可选标志

正则表达式能够包括有些可选标志修饰符来掌控匹配的模式。修饰符被指定为一个可选的标志。多个标志能够经过按位 OR(|) 她们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

正则表达式模式

模式字符串运用特殊的语法来暗示一个正则表达式:

字母和数字暗示她们自己。一个正则表达式模式中的字母和数字匹配一样的字符串。

都数字母和数字前加一个反斜杠时会持有区别的含义。

标点符号仅有被转义时才匹配自己,否则它们暗示特殊的含义。

反斜杠本身必须运用反斜杠转义。

因为正则表达式一般包括反斜杠,因此你最好运用原始字符串来暗示它们。模式元素(如 r\t,等价于 \\t)匹配相应的特殊字符。

下表列出了正则表达式模式语法中的特殊元素。倘若运用模式的同期供给了可选的标志参数,某些模式元素的含义会改变。

正则表达式实例





上一篇:编程学习规划,Scartch、Python、C++怎么选
下一篇:非常钟教会你运用Python操作excel,内附过程和代码
回复

使用道具 举报

3047

主题

3万

回帖

9606万

积分

论坛元老

Rank: 8Rank: 8

积分
96065852
发表于 2024-10-4 15:20:46 | 显示全部楼层
感谢您的精彩评论,为我带来了新的思考角度。
回复

使用道具 举报

3138

主题

3万

回帖

9996万

积分

论坛元老

Rank: 8Rank: 8

积分
99968624
发表于 2024-10-4 20:36:18 | 显示全部楼层
你的见解独到,让我受益匪浅,非常感谢。
回复

使用道具 举报

3070

主题

3万

回帖

9915万

积分

论坛元老

Rank: 8Rank: 8

积分
99158931
发表于 2024-10-9 11:18:11 | 显示全部楼层
你的话语如春风拂面,让我感到无比温暖。
回复

使用道具 举报

2946

主题

2万

回帖

9997万

积分

论坛元老

Rank: 8Rank: 8

积分
99979427
发表于 2024-10-11 06:36:59 | 显示全部楼层
你的见解真是独到,让我受益匪浅。
回复

使用道具 举报

2946

主题

2万

回帖

9997万

积分

论坛元老

Rank: 8Rank: 8

积分
99979427
发表于 前天 06:59 | 显示全部楼层
楼主发的这篇帖子,我觉得非常有道理。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 00:34 , Processed in 0.116272 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.