位置:首页 > 脚本语言 > Python在线教程 > 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 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

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 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!!"

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

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 are smarter than dogs";

matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print "match --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"

searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
   print "search --> searchObj.group() : ", searchObj.group()
else:
   print "Nothing found!!"

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

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)
re.M 使$匹配一行(串的不只是端部)的尾部,使^匹配的行(串不只是开始)的开始
re.S 使一个句号(点)匹配任何字符,包括换行符
re.U 根据Unicode字符集解释的字母。这个标志会影响w, W, , 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 匹配字符串的开始