正则表达式是一个特殊的字符序列,可帮助您使用模式中保存的专用语法来匹配或查找其他字符串或字符串集.正则表达式在UNIX世界中被广泛使用.
模块 re 完全支持Python中类似Perl的正则表达式.如果在使用正则表达式编译或
时发生错误,则re模块会引发异常re.error.
我们将介绍两个重要函数,它们将用于处理常规函数表达式.但首先是一件小事:有各种各样的字符,当它们用于正则表达式时会有特殊意义.为了避免在处理正则表达式时出现任何混淆,我们将使用Raw Strings作为 r'expression'.
此函数尝试将RE pattern 与 string 匹配,并带有可选的标志.
以下是此函数的语法 :
re.match(pattern,string,flags = 0)
以下是参数的说明 :
Sr.No. | 参数&说明 |
---|---|
1 | pattern 这是要匹配的正则表达式. |
2 | string 这是字符串,将被搜索以匹配字符串开头的模式. |
3 | flags 您可以使用按位OR(|)指定不同的标志.这些是修饰符,列在下表中. |
re.match 函数成功返回匹配对象,失败时返回无.我们使用 group(num)或 groups() match 对象的函数来获得匹配的表达式.
Sr.No. | 匹配对象方法&说明 |
---|---|
1 | group(num = 0) 此方法返回整个匹配(或特定子组num) |
2 | 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
此函数在字符串模式>使用可选的标志.
以下是此函数的语法 :
re.search(pattern,string,flags = 0)
以下是参数的说明 :
Sr.No. | 参数&说明 |
---|---|
1 | pattern 这是要匹配的正则表达式. |
2 | string 这是字符串,将被搜索以匹配字符串中任何位置的模式. |
3 | flags 您可以使用按位OR(|)指定不同的标志.这些是修饰符,列在下表中. |
re.search 函数成功返回匹配对象,失败时返回无.我们使用 group(num)或 groups() match 对象的函数来获得匹配的表达式.
Sr.No. | 匹配对象方法&说明 |
---|---|
1 | group(num = 0) 此方法返回整个匹配(或特定子组num) |
2 | 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!!"
执行上述代码时,会产生以下结果 :
searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats searchObj.group(2) : smarter
Python提供了两种基于正则表达式的基本操作: match 仅在字符串的开头检查匹配,而搜索检查字符串中的任何位置(这是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
最重要的一个重新使用正则表达式的方法是 sub .
re.sub(pattern,repl,string,max = 0)
此方法替换<的所有出现的RE 模式 i> string with repl ,替换所有出现,除非提供 max .此方法返回修改后的字符串.
#!/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
正则表达式文字可能包含一个可选修饰符来控制匹配的各个方面.修饰符被指定为可选标志.您可以使用异或(|)提供多个修饰符,如前所示,可以用以下之一表示;
Sr.No. | 修饰符&说明 |
---|---|
1 | re.I 执行不区分大小写的匹配. |
2 | re.L 根据当前的语言环境.此解释会影响字母组(\w和\ W)以及字边界行为(\b和\ B). |
3 | re.M 使$匹配行的结尾(不仅仅是字符串的结尾)并使^匹配任何行的开头(不仅仅是字符串的开头). |
4 | re.S 使句点(点)匹配任何字符,包括换行符. |
5 | re.U 根据Unicode字符集.此标志会影响\ w,\ W,\ b,\B的行为. |
6 | re.X 允许"cuter"正则表达式语法.它忽略了空格(除了set []内部或者用反斜杠转义时)并将未转义的#视为注释标记. |
除控制字符外,(+?.* ^ $()[] {} | \) ,所有人物都匹配自己.您可以通过在控制字符前面加上反斜杠来转义它.
下表列出了Python中可用的正则表达式语法 :
Sr.No. | 模式&说明 |
---|---|
1 | ^ 匹配行首. |
2 | $ 匹配行尾. |
3 | . 匹配除换行符之外的任何单个字符.使用m选项也可以匹配换行符. |
4 | [...] 匹配括号中的任何单个字符. |
5 | [^ ...] 匹配括号内的任何单个字符 |
6 | re * 匹配0个或多个前面的表达式. |
7 | re + 匹配1个或多个前面的表达式. |
8 | re? 匹配0或1出现在前表达式. |
9 | re {n} 完全匹配前面表达式的n次出现次数. |
10 | re { n,} 匹配前面表达式的n个或多个匹配项. |
11 | re {n,m} 匹配前面表达式中至少n次和最多m次出现. |
12 | a | b 匹配a或b. |
13 | (re) 分组正则表达式并记住匹配的文本. |
14 | (?imx) 暂时切换正则表达式中的i,m或x选项.如果在括号中,只有该区域受到影响. |
15 | (? - imx) 暂时切换正则表达式中的i,m或x选项.如果在括号中,只有该区域受到影响. |
16 | (?:re) 将正则表达式分组而不记住匹配的文本. |
17 | (?imx:re) 临时切换括号内的i,m或x选项. |
18 | (? - imx:re) 临时切换括号内的i,m或x选项. |
19 | (?#...) 评论. |
20 | (?= re ) 使用模式指定位置.没有范围. |
21 | (?!re) 使用模式否定指定位置.没有范围. |
22 | (?> re) 匹配独立模式而不回溯. |
23 | \w 匹配单词字符. |
24 | \ W 匹配非单词字符. |
25 | \s 匹配空格.相当于[\\\\\\\\]. |
26 | \S 匹配非空白. |
27 | \d 匹配数字.相当于[0-9]. |
28 | \ D 匹配非数字. |
29 | \A 匹配字符串的开头. |
30 | \ Z 匹配字符串结尾.如果存在换行符,则它在换行符之前匹配. |
31 | \ z 匹配字符串结尾. |
32 | \ G 匹配最后一场比赛结束的点. |
33 | \ b 在括号外匹配字边界.在括号内匹配退格(0x08). |
34 | \B 匹配非单词边界. |
35 | \ n,\t等 匹配换行符,回车符,制表符等. |
36 | \1 ... \ 9 匹配第n个分组子表达式. |
37 | \10 匹配已匹配的第n个分组子表达式.否则引用字符代码的八进制表示. |
Sr.No. | 示例&说明 |
---|---|
1 | python 匹配"python". |
Sr.No. | 示例&说明 |
---|---|
1 | [Pp] ython 匹配"Python"或"python" |
2 | rub [ye] 匹配"ruby"或"rube" |
3 | [aeiou] 匹配任何一个小写元音 |
4 | [0-9] 匹配任何数字;与[0123456789]相同 |
5 | [az] 匹配任何小写的ASCII字母 |
6 | [AZ] 匹配任何大写的ASCII字母 |
7 | [a-zA-Z0-9] 匹配以上任何一项 |
8 | [^ aeiou] 匹配除小写元音以外的任何内容 |
9 | [^ 0-9] 匹配除数字以外的任何内容 |
Sr.No. | 示例&说明 | |
---|---|---|
1 | . 匹配除换行符之外的任何字符 | |
2 | \ d 匹配数字:[0-9 ] | |
3 | \ D 匹配非数字:[^ 0-9] | |
4 | \s 匹配空格字符:[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ td class ="ts"> 5 | \S 匹配非空白:[^ \ t \\\\\ [] |
6 | \ w 匹配单个字符:[A-Za-z0-9 _] | |
7 | \ w 匹配一个非单词字符:[^ A-Za-z0-9 _] |
Sr .No. | 示例&说明 |
---|---|
1 | ruby? 匹配"rub"或"ruby":y是可选的 |
2 | ruby * 匹配"rub"加0或更多ys |
3 | ruby + 匹配"rub"加1或更多ys |
4 | \d {3} 正好匹配3位 |
5 | \d {3,} 匹配3个或更多数字 |
6 | \ d {3,5} 匹配3,4或5位 |
这匹配最小的重复次数和减去;
Sr.No. | 示例&说明 |
---|---|
1 | <.*> 贪婪重复:匹配"< python> perl>" |
2 | <.*?> Nongreedy:匹配"< python>"在"< python> perl>" |
Sr.No. | 示例&说明 |
---|---|
1 | \D\d+ 没有组:+重复\d |
2 | (\D\d)+ 分组:+重复\ D \ d对 |
3 | ([Pp] ython(,)?)+ 匹配"Python" ,"Python,python,python"等. |
这匹配先前匹配的组 :
Sr.No. | 示例&说明 |
---|---|
1 | ([Pp])ython& \ nails 匹配python& pails或Python& Pails |
2 | (['"])[^ \1] * \\ \\ _ 单引号或双引号.\ 1匹配第一组匹配的任何内容.\ 2.匹配第二组匹配的任何内容等. |
Sr.No. | 示例和描述 |
---|---|
1 | python | perl 匹配"python"或"perl" |
2 | rub(y | le)) 匹配"红宝石"或"卢布" |
3 | Python(!+ | \?) "P ython"后跟一个或多个!或者一个? |
这需要指定匹配位置.
Sr.No. | 示例&说明 |
---|---|
1 | ^ Python 在字符串或内部行的开头匹配"Python" |
2 | Python $ 在字符串或行的末尾匹配"Python" |
3 | \APython 在字符串的开头匹配"Python" |
4 | Python \ Z 在字符串末尾匹配"Python" |
5 | \ bPython \ b 匹配字边界处的"Python" |
6 | \ brub \ B \B是非单词边界:匹配"rube"和"ruby"中的"rub"但并非一个人 |
7 | 的Python(?=!) 匹配"Python",如果后跟感叹号. |
8 | Python(?!!) 匹配"Python",如果没有后跟感叹号. |
Sr.No. | 示例&说明 |
---|---|
1 | R(?#comment) 匹配"R".所有其余的都是评论 |
2 | R(?i)uby 匹配"uby"时不区分大小写 |
3 | R(?i:uby) 与上述相同 |
4 | rub(?:y | le)) 仅在没有创建\1的情况下进行分组反向引用 |