Python正则表达式

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反向引用

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值