Python正则表达式

来源:互联网 发布:魅丽文化网络编辑招聘 编辑:程序博客网 时间:2024/06/03 10:48

Python正则表达式


正则表达式是字符一个特殊的序列,可帮助匹配或者寻找其他的字符串或一组字符串,用一个模式支持一个专门的语法。正则表达式被广泛应用于UNIX世界中。

模块re在Python提供类似Perl的正则表达式全面支持。 re模块引发异常re.error如果在编译或使用正则表达式时发生错误。

我们将涉及两个重要的功能,这将被用于处理的正则表达式。但是首先:有各种各样的字符,当它们在正则表达式中使用,将有特殊的意义。为了避免在处理正则表达式的任何困惑,将使用原始字符串作为r'expression“。

match函数

此函数会尝试重新模式匹配字符串可选标志。

下面是此函数的语法:

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

这里的参数的说明:

参数

描述

pattern

这是正则表达式来进行匹配。

string

这是字符串,这将被搜索匹配的模式,在字符串的开头。

flags

可以指定使用位的不同的标志OR (|)。这些改性剂,其列于下表中。

re.match函数返回成功,失败匹配对象则返回None。我们会group(num) orgroups()函数匹配对象来获得匹配的表达式。

匹配对象的方法

描述

group(num=0)

此方法返回整个匹配(或指定分组num)

groups()

此方法返回所有元组匹配的子组(空,如果没有)

例子:

#!/usr/bin/python

import re

 

line ="Cats aresmarter 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"Nomatch!!"

当执行上面的代码,它产生以下结果:

matchObj.group() :  Cats are smarter than dogs

matchObj.group(1) :  Cats

matchObj.group(2) :  smarter

search函数

此函数将搜索字符串中使用可选的标志第一次出现的RE模式。

下面是此函数语法:

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

这里的参数说明:

参数

描述

pattern

这是正则表达式来进行匹配。

string

这是字符串,这将被搜索到的字符串中的任何位置匹配的模式。

flags

可以指定使用位的不同的标志OR (|)。这些改性剂,其列于下表中。

re.search函数返回成功,没有失败的匹配对象。我们会用group(num) 或groups() 函数来获得匹配的表达式。

匹配对象的方法

描述

group(num=0)

此方法返回整个匹配(或指定分组num)

groups()

此方法返回所有元组匹配的子组(空,如果没有)

例子:

#!/usr/bin/python

import re

 

line ="Cats aresmarter 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"Nothingfound!!"

当执行上面的代码,它产生以下结果:

matchObj.group() :  Cats are smarter than dogs

matchObj.group(1) :  Cats

matchObj.group(2) :  smarter

匹配VS搜索:

python提供基于正则表达式两种不同的基本操作:只在字符串的开头匹配检查的匹配,而对于一个匹配字符串中的任何位置搜索检查(这是Perl并在默认情况下)。

例子:

#!/usr/bin/python

import re

 

line ="Cats aresmarter than dogs";

 

matchObj = re.match( r'dogs', line, re.M|re.I)

if matchObj:

   print"match--> matchObj.group() : ", matchObj.group()

else:

   print"Nomatch!!"

 

searchObj = re.search( r'dogs', line, re.M|re.I)

if searchObj:

   print"search--> searchObj.group() : ", searchObj.group()

else:

   print"Nothingfound!!"

当执行上面的代码,产生以下结果:

No match!!

search --> matchObj.group() :  dogs

搜索和替换:

一些最重要的re方法,使用正则表达式sub。

语法

re.sub(pattern, repl,string, max=0)

这种方法取代了RE模式字符串中使用的Perl所有匹配,替换所有出现如果提供最大匹配。这个方法将返回修改后的字符串。

例子

下面是一个例子:

#!/usr/bin/python

import re

 

phone ="2004-959-559# This is Phone Number"

 

# Delete Python-style comments

num = re.sub(r'#.*$',"", phone)

print"Phone Num : ", num

 

# Remove anything other than digits

num = re.sub(r'\D',"", phone)   

print"Phone Num : ", num

当执行上面的代码,产生以下结果:

Phone Num :  2004-959-559

Phone Num :  2004959559

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

正则表达式字面可以包含一个可选的修饰符来控制匹配的各个方面。修饰符被指定为一个可选的标志。可以使用异或提供多个修饰符(|),如先前所示,并且可以由这些中的一个来表示:

修辞符

描述

re.I

执行不区分大小写的匹配。

re.L

根据当前的语言环境解释词组。这种解释影响字母组(\w和\W),以及单词边界的行为(\b和\B)

re.M

使$匹配一行(串的不只是端部)的尾部,使^匹配的行(串不只是开始)的开始

re.S

使一个句号(点)匹配任何字符,包括换行符

re.U

根据Unicode字符集解释的字母。这个标志会影响\w, \W, \b, \B的行为。

re.X

许可证“cuter”正则表达式语法。它忽略空格(除了一组[]或当用一个反斜杠转义内),并把转义#作为注释标记

正则表达式模式:

除了控制字符(+ ? . * ^$ ( ) [ ] { } | \),所有字符匹配自己。可以通过用反斜杠前就转义控制字符。

下表列出了Python中可用正则表达式语法:

模式

描述

^

匹配的开始的

$

匹配行尾

.

匹配除换行符的任何单个字符。使用-m选项允许其匹配换行符也是如此。

[...]

匹配括号内任何单个字符

[^...]

匹配任何单个字符不在括号中

re*

匹配0个或多个匹配前面表达式。

re+

匹配1个或多个先前出现的表达式。

re?

匹配0或1前面出现的表达式。

re{ n}

精确匹配n个前面表达式的数量。

re{ n,}

匹配n或多次出现上述表达式。

re{ n, m}

匹配至少n次和前面表达式的大多数出现m次。

a| b

匹配a或b。

(re)

组正则表达式并记住匹配的文本。

(?imx)

暂时切换上 i, m 或 x正则表达式的选项。如果括号中,仅该区域受到影响。

(?-imx)

暂时关闭切换 i, m, 或 x 正则表达式的选项。如果括号中,仅该区域受到影响。

(?: re)

组正则表达式而不匹配的记住文字。

(?imx: re)

暂时切换上i, m, 或 x 括号内的选项。

(?-imx: re)

暂时关闭切换i, m, 或 x 括号内的选项。

(?#...)

注释

(?= re)

指定使用的模式位置,没有一个范围。

(?! re)

指定使用模式取反位置,没有一个范围。

(?> re)

匹配独立的模式而不反向追踪。

\w

匹配单词字符。

\W

匹配非单词字符

\s

匹配的空白,等价于[\ t\ñ\ r\ F]

\S

匹配非空白

\d

匹配的数字。等价于[0-9]

\D

匹配非数字

\A

匹配字符串的开始

\Z

匹配字符串的结尾。如果一个换行符的存在,它只是换行之前匹配

\z

匹配字符串的结尾

\G

匹配点,最后一次匹配结束

\b

匹配单词边界之外时,括号内。匹配退格键(0×08),括号里面的时候

\B

匹配非单词边界

\n, \t, etc.

匹配换行符,回车符,制表符等

\1...\9

匹配第n个分组的子表达式。

\10

匹配,如果它已经匹配第n个分组的子表达式。否则指的是一个字符码的八进制表示。

正则表达式的例子

文字字符:

示例

描述

python

匹配 "python".

字符类:

示例

描述

[Pp]ython

匹配 "Python" 或 "python"

rub[ye]

匹配  "ruby" 或 "rube"

[aeiou]

匹配任何一个小写元音

[0-9]

匹配任何数字;如果[0123456789]

[a-z]

匹配任何小写ASCII的字母

[A-Z]

匹配任何大写的ASCII字母

[a-zA-Z0-9]

匹配任何上述的

[^aeiou]

匹配任何不是小写元音

[^0-9]

匹配任何非数字

特殊字符类:

示例

描述

.

匹配除换行符外的任何字符

\d

匹配一个数字:[0-9]

\D

匹配一个非数字:[^0-9]

\s

匹配一个空白字符:[\ t\ r\ñ\ F]

\S

匹配非空白:[^\ t\ r\ñ\ F]

\w

匹配一个单词字符:[A-ZA-Z0-9 _]

\W

匹配非单词字符:[^ A-ZA-Z0-9 _]

重复案例:

示例

描述

ruby?

匹配“rub”或“ruby”:y是可选的

ruby*

匹配“rub”加上0个或多个ys

ruby+

匹配“rub”加上1个或多个ys

\d{3}

完全匹配3个数字

\d{3,}

完全匹配3个及以上的数字

\d{3,5}

匹配3,4或5个数字

非贪婪的重复:

匹配最小重复次数:

示例

描述

<.*>

贪婪的重复:匹配“<python>perl>”

<.*?>

非贪婪:匹配“<python>”,在“<python>perl>”

分组使用括号:

示例

描述

\D\d+

不分组:+重复\d

(\D\d)+

分组:+重复\D\d对

([Pp]ython(, )?)+

匹配“Python”,“Python, python, python”等。

反向引用:

再次匹配​​先前匹配的组:

示例

描述

([Pp])ython&\1ails

匹配python&pails或Python&Pails

(['"])[^\1]*\1

单或双引号字符串。 \1匹配第一组匹配。 \2匹配第二组匹配等等。

替代方案:

示例

描述

python|perl

匹配"python" 或 "perl"

rub(y|le))

匹配 "ruby" 或 "ruble"

Python(!+|\?)

“Python”后跟一个或多个!或者一个?

锚点:

需要指定匹配位置

示例

描述

^Python

匹配“Python”在一个字符串或内部行的开始

Python$

匹配“巨蟒”的字符串或行尾

\APython

匹配“Python”在字符串的开始

Python\Z

匹配“Python”在字符串的结尾

\bPython\b

匹配“Python”在字边界

\brub\B

\B非单词的边界:匹配“rub”,“rube”和“ruby”,但并不单独

Python(?=!)

匹配“Python”,如果后面的感叹号

Python(?!!)

匹配“Python”,如果后面不是感叹号

特殊的语法用圆括号:

示例

描述

R(?#comment)

符合“R”。其余全是注释

R(?i)uby

当匹配“uby”时,不区分大小写

R(?i:uby)

与上述相同

rub(?:y|le))

只有组,而无需创建\1反向引用

 


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被打了狂犬疫苗的狗咬伤怎么办 美版苹果7系统坏了怎么办 韩服的球球大作战网络不稳定怎么办 球球大作战号删了找不回来怎么办 队友传足球球的时候接不到怎么办 魅族手机中病毒锁机了怎么办? vbs打开是和文本文档一样怎么办 把电脑注册表删了电脑动不了怎么办 注册表删一项后电脑启动不了怎么办 解压过的过的软件安装包损坏怎么办 手机中病毒自动发短信扣费怎么办 苹果手机中的高德地图打不开怎么办 大晚上挂了别人的车怎么办 手机不兼容高版本微信怎么办 绝地求生右下角小地图变大了怎么办 杯孕当月做了C丁怎么办 玩全军出击手机发烫就出现卡怎么办 不小心买了彩虹六号肝帝版本怎么办 微信游戏刺激战场电脑卡怎么办 电脑更新了以前的东西都没了怎么办 安装黑苹果鼠标键盘不能用怎么办 苹果开机卡在白底黑苹果怎么办 信长之野望14没有剧情触发怎么办 玩cf手游手机屏幕摩擦力大怎么办 网吧有战地1没有橘子平台怎么办 俩人打仗了对方想讹我怎么办 环世界模组装多了打不开怎么办 手机百度云视频播放画面太小怎么办 ps文件说数据似乎已经损坏怎么办 百度云中的压缩包下载的很慢怎么办 游戏压缩出现未知错误或损坏怎么办 百度云里的压缩包解压后损坏怎么办 联创打印时显示压缩文件失败怎么办 电脑的软件打开出现未知格式怎么办 图片只突出人物边上全黑怎么办 合金机兵存档密码忘了怎么办 手机网页验证码无法加载插件怎么办 绝地求生次激战场机型不支持怎么办 木茷生存中文版安装包损坏了怎么办 手机下载软件显示安装包损坏怎么办 不小心把qq图片删了怎么办