Python - 正则表达式
上一页下一页
一个正则表达式 是一个特殊的字符序列,可以帮助您匹配或查找其他字符串或字符串集,使用模式中的特殊语法。正则表达式在 UNIX 世界中被广泛使用。
Python 模块 re 为 Python 中的类 Perl 正则表达式提供全面支持。如果在编译或使用正则表达式时发生错误,re 模块会引发异常 re.error。
我们将介绍两个重要的函数,它们将用于处理正则表达式。但首先要说一件小事:有各种各样的字符,当它们用于正则表达式时会有特殊的含义。为避免在处理正则表达式时出现任何混淆,我们将使用原始字符串作为 r'expression' .
匹配 功能
此函数尝试匹配 RE pattern 到 字符串 带有可选的标志 .
这是此函数的语法 -
re.match(pattern, string, flags=0)
这是参数的说明 -
Sr.No. | 参数及说明 |
---|---|
1 | 模式 这是要匹配的正则表达式。 |
2 | 字符串 这是字符串,它将被搜索以匹配字符串开头的模式。 |
3 | 标志 您可以使用按位或 (|) 指定不同的标志。这些是修饰符,如下表所示。 |
re.match 函数返回一个匹配 对象成功,无 关于失败。我们使用group(num) 或 groups() 匹配的功能 对象来获取匹配的表达式。
Sr.No. | 匹配对象方法和描述 |
---|---|
1 | 组(num=0) 此方法返回整个匹配(或特定子组编号) |
2 | 组() 该方法返回一个元组中所有匹配的子组(如果没有则为空) |
示例
现场演示#!/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 pattern 在 字符串 内 带有可选的标志 .
这是此函数的语法 -
re.search(pattern, string, flags=0)
这是参数的说明 -
Sr.No. | 参数及说明 |
---|---|
1 | 模式 这是要匹配的正则表达式。 |
2 | 字符串 这是字符串,它将被搜索以匹配字符串中任何位置的模式。 |
3 | 标志 您可以使用按位或 (|) 指定不同的标志。这些是修饰符,如下表所示。 |
re.search 函数返回一个匹配 对象成功,无 关于失败。我们使用 group(num) 或 groups() 匹配的功能 对象来获取匹配的表达式。
Sr.No. | 匹配对象方法和描述 |
---|---|
1 | 组(num=0) 此方法返回整个匹配(或特定子组编号) |
2 | 组() 该方法返回一个元组中所有匹配的子组(如果没有则为空) |
示例
现场演示#!/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 仅在字符串的开头检查匹配项,而 search 检查字符串中任何地方的匹配项(这是 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 --> searchObj.group() : dogs
搜索和替换
最重要的re之一 使用正则表达式的方法是 sub .
语法
re.sub(pattern, repl, string, max=0)
此方法替换所有出现的 RE pattern 在 字符串 与 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 允许“更可爱”的正则表达式语法。它忽略空格(除了在集合 [] 内或被反斜杠转义时)并将未转义的 # 视为注释标记。 |
正则表达式模式
除了控制字符,(+ ? . * ^ $ ( ) [ ] { } | \) , 所有字符都匹配自己。您可以通过在控制字符前面加上反斜杠来转义它。
下表列出了 Python 中可用的正则表达式语法 -
Sr.No. | 图案&描述 |
---|---|
1 | ^ 匹配行首。 |
2 | $ 匹配行尾。 |
3 | 。 匹配除换行符以外的任何单个字符。使用 m 选项也可以匹配换行符。 |
4 | [...] 匹配括号中的任何单个字符。 |
5 | [^...] 匹配任何不在括号中的单个字符 |
6 | 重新* 匹配 0 次或多次出现的前面表达式。 |
7 | 重新+ 匹配 1 次或多次出现的前面表达式。 |
8 | 是吗? 匹配 0 或 1 次出现的前面表达式。 |
9 | 重新{ n} 精确匹配前面表达式的 n 次出现。 |
10 | 重新{ n,} 匹配 n 次或多次出现的前面表达式。 |
11 | 重新{ n, m} 匹配至少 n 次和最多 m 次出现的前面表达式。 |
12 | 一个| b 匹配 a 或 b。 |
13 | (重新) 对正则表达式进行分组并记住匹配的文本。 |
14 | (?imx) 临时切换正则表达式中的 i、m 或 x 选项。如果在括号中,则只有该区域受到影响。 |
15 | (?-imx) 暂时关闭正则表达式中的 i、m 或 x 选项。如果在括号中,则只有该区域受到影响。 |
16 | (?:重新) 对正则表达式进行分组而不记住匹配的文本。 |
17 | (?imx:re) 暂时打开括号内的 i、m 或 x 选项。 |
18 | (?-imx:re) 暂时关闭括号内的 i、m 或 x 选项。 |
19 | (?#...) 评论。 |
20 | (?=重新) 使用模式指定位置。没有范围。 |
21 | (?!重新) 使用模式否定指定位置。没有范围。 |
22 | (?> 重新) 匹配独立模式而不回溯。 |
23 | \w 匹配单词字符。 |
24 | \W 匹配非单词字符。 |
25 | \s 匹配空格。等价于 [\t\n\r\f]。 |
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”。 |
字符类
Sr.No. | 示例和说明 |
---|---|
1 | [Pp]ython 匹配“Python”或“python” |
2 | 擦[耶] 匹配“ruby”或“rube” |
3 | [aeiou] 匹配任意一个小写元音 |
4 | [0-9] 匹配任何数字;同[0123456789] |
5 | [a-z] 匹配任意小写 ASCII 字母 |
6 | [A-Z] 匹配任意大写 ASCII 字母 |
7 | [a-zA-Z0-9] 匹配以上任意一项 |
8 | [^aeiou] 匹配除小写元音以外的任何内容 |
9 | [^0-9] 匹配除数字以外的任何内容 |
特殊字符类
Sr.No. | 示例和说明 |
---|---|
1 | 。 匹配除换行符以外的任何字符 |
2 | \d 匹配一个数字:[0-9] |
3 | \D 匹配非数字:[^0-9] |
4 | \s 匹配一个空白字符:[ \t\r\n\f] |
5 | \S 匹配非空白:[^ \t\r\n\f] |
6 | \w 匹配单个单词字符:[A-Za-z0-9_] |
7 | \W 匹配一个非单词字符:[^A-Za-z0-9_] |
重复案例
Sr.No. | 示例和说明 |
---|---|
1 | 红宝石? 匹配“rub”或“ruby”:y是可选的 |
2 | 红宝石* 匹配“rub”加0个或多个ys |
3 | 红宝石+ 匹配“rub”加1个或多个ys |
4 | \d{3} 精确匹配 3 位数字 |
5 | \d{3,} 匹配 3 个或更多数字 |
6 | \d{3,5} 匹配 3、4 或 5 位数字 |
非贪婪重复
这匹配最少的重复次数 -
Sr.No. | 示例和说明 |
---|---|
1 | <.*>
贪婪重复:匹配“ |
2 | <.*?>
Nongreedy:匹配“ |
用括号分组
Sr.No. | 示例和说明 |
---|---|
1 | \D\d+ 无组:+ 重复 \d |
2 | (\D\d)+ 分组:+重复\D\d对 |
3 | ([Pp]ython(, )?)+ 匹配“Python”、“Python、python、python”等 |
反向引用
这再次匹配先前匹配的组 -
Sr.No. | 示例和说明 |
---|---|
1 | ([Pp])ython&\1ails 匹配 python&pails 或 Python&Pails |
2 | (['"])[^\1]*\1 单引号或双引号字符串。 \1 匹配第一组匹配的任何内容。 \2 匹配第二组匹配的任何内容,等等。 |
替代方案
Sr.No. | 示例和说明 |
---|---|
1 | python|perl 匹配“python”或“perl” |
2 | 擦(y|le)) 匹配“红宝石”或“卢布” |
3 | Python(!+|\?) “Python”后跟一个或多个!还是一个? |
锚点
这需要指定匹配位置。
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 | 擦(?:y|le)) 仅分组而不创建 \1 反向引用 |
Python