正则表达式是一个特殊的字符序列,可以帮助您使用模式中保留的专门语法来匹配或查找其他字符串或字符串集。 正则表达式在unix世界中被广泛使用。
注:很多开发人员觉得正则表达式比较难以理解,主要原因是缺少使用或不愿意在这上面花时间。
re模块在python中提供对perl类正则表达式的完全支持。如果在编译或使用正则表达式时发生错误,则re模块会引发异常re.error。
在这篇文章中,将介绍两个重要的功能,用来处理正则表达式。 然而,首先是一件小事:有各种各样的字符,这些字符在正则表达式中使用时会有特殊的意义。 为了在处理正则表达式时避免混淆,我们将使用:r'expression'原始字符串。
匹配单个字符的基本模式
| 编号 | 表达式 | 描述 |
|---|---|---|
| 1 | a, x, 9, < |
普通字符完全匹配。 |
| 2 | . |
匹配任何单个字符,除了换行符’\n‘ |
| 3 | \w |
匹配“单词”字符:字母或数字或下划线[a-za-z0-9_]。 |
| 4 | \w |
匹配任何非字词。 |
| 5 | \b |
字词与非字词之间的界限 |
| 6 | \s |
匹配单个空格字符 - 空格,换行符,返回,制表符 |
| 7 | \s |
匹配任何非空格字符。 |
| 8 | \t, \n, \r |
制表符,换行符,退格符 |
| 9 | \d |
十进制数[0-9] |
| 10 | ^ |
匹配字符串的开头 |
| 11 | $ |
匹配字符串的末尾 |
| 12 | \ |
抑制字符的“特殊性”,也叫转义字符。 |
编译标志
编译标志可以修改正则表达式的某些方面。标志在re模块中有两个名称:一个很长的名称,如ignorecase,和一个简短的单字母形式,如i。
| 编号 | 标志 | 含义 |
|---|---|---|
| 1 | ascii, a | 像\w,\b,\s和\d之间的几个转义只匹配ascii字符与相应的属性。 |
| 2 | dotall, s | 匹配任何字符,包括换行符 |
| 3 | ignorecase, i | 不区分大小写匹配 |
| 4 | locale, l | 做一个区域感知的匹配 |
| 5 | multiline, m | 多行匹配,影响^和$ |
| 6 | verbose, x (for ‘extended’) | 启用详细的re,可以更干净,更容易理解 |
此函数尝试将re模式与可选标志的字符串进行匹配。
下面是函数的语法 -
re.match(pattern, string, flags = 0)
这里是参数的描述 -
pattern - 这是要匹配的正则表达式。 string - 这是字符串,它将被搜索用于匹配字符串开头的模式。 |flags - 可以使用按位or(|)指定不同的标志。 这些是修饰符,如下表所列。re.match函数在成功时返回匹配对象,失败时返回none。使用match(num)或groups()函数匹配对象来获取匹配的表达式。
| 编号 | 匹配对象 | 描述 |
|---|---|---|
| 1 | group(num = 0) |
此方法返回整个匹配(或特定子组num) |
| 2 | groups() |
此方法返回一个元组中的所有匹配子组(如果没有,则返回为none) |
示例
#!/usr/bin/python3
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模式与可选标志的字符串进行匹配。
下面是这个函数的语法 -
re.match(pattern, string, flags = 0)
这里是参数的描述 -
pattern - 这是要匹配的正则表达式。 string - 这是字符串,它将被搜索用于匹配字符串开头的模式。 |flags - 可以使用按位or(|)指定不同的标志。 这些是修饰符,如下表所列。re.search函数在成功时返回匹配对象,否则返回none。使用match对象的group(num)或groups()函数来获取匹配的表达式。
| 编号 | 匹配对象 | 描述 |
|---|---|---|
| 1 | group(num = 0) |
此方法返回整个匹配(或特定子组num) |
| 2 | groups() |
此方法返回一个元组中的所有匹配子组(如果没有,则返回为none) |
示例
#!/usr/bin/python3
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
python提供基于正则表达式的两种不同的原始操作:match检查仅匹配字符串的开头,而search检查字符串中任何位置的匹配(这是perl默认情况下的匹配)。
示例
#!/usr/bin/python3
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)
此方法使用repl替换所有出现在re模式的字符串,替换所有出现,除非提供max。此方法返回修改的字符串。
示例
#!/usr/bin/python3
import re
phone = "2018-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 : 2018-959-559
phone num : 2018959559
正则表达式文字可能包含一个可选修饰符,用于控制匹配的各个方面。 修饰符被指定为可选标志。可以使用异或(|)提供多个修饰符,如前所示,可以由以下之一表示 -
| 编号 | 修辞符 | 描述 |
|---|---|---|
| 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”正则表达式语法。 它忽略空格(除了一个集合[]内部,或者用反斜杠转义),并将未转义的#作为注释标记。 |
除了控制字符(+ ? . * ^ $ ( ) [ ] { } | \),所有字符都与其自身匹配。 可以通过使用反斜杠将其转换为控制字符。
字符常量
| 编号 | 示例 | 说明 |
|---|---|---|
| 1 | python | 匹配“python”。 |
字符类
| 编号 | 示例 | 说明 |
|---|---|---|
| 1 | [pp]ython |
匹配“python”或“python” |
| 2 | rub[ye] |
匹配“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] |
匹配数字以外的任何东西 |
特殊字符类
| 编号 | 示例 | 说明 |
|---|---|---|
| 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_] |
重复匹配
| 编号 | 示例 | 说明 |
|---|---|---|
| 1 | ruby? |
匹配“rub”或“ruby”:y是可选的 |
| 2 | ruby* |
匹配“rub”加上0个以上的y |
| 3 | ruby+ |
匹配“rub”加上1个或更多的y |
| 4 | \d{3} |
完全匹配3位数 |
| 5 | \d{3,} |
匹配3位或更多位数字 |
| 6 | \d{3,5} |
匹配3,4或5位数 |
非贪婪重复
这匹配最小的重复次数 -
| 编号 | 示例 | 说明 |
|---|---|---|
| 1 | <.*> |
贪婪重复:匹配“<python> perl>” |
| 2 | <.*?> |
非贪婪重复:在“<python> perl”中匹配“<python>” |
用圆括号分组
| 编号 | 示例 | 说明 |
|---|---|---|
| 1 | \d\d+ |
没有分组:+重复\d |
| 2 | (\d\d)+ |
分组:+重复\d\d对 |
| 3 | ([pp]ython(,)?)+ |
匹配“python”,“python,python,python”等 |
反向引用
这与以前匹配的组再次匹配 -
| 编号 | 示例 | 说明 |
|---|---|---|
| 1 | ([pp])ython&\1ails |
匹配python和pails或python和pails |
| 2 | (['"])[^\1]*\1 |
单引号或双引号字符串。\1匹配第一个分组匹配。 \2匹配任何第二个分组匹配等 |
备择方案
python|perl - 匹配“python”或“perl”rub(y|le) - 匹配 “ruby” 或 “ruble”python(!+|\?) - “python”后跟一个或多个! 还是一个?锚点
这需要指定匹配位置。
| 编号 | 示例 | 说明 |
|---|---|---|
| 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”,如果没有感叹号后面。 |
带括号的特殊语法
| 编号 | 示例 | 说明 | |
|---|---|---|---|
| 1 | r(?#comment) |
匹配“r”。其余的都是注释 | |
| 2 | r(?i)uby |
匹配“uby”时不区分大小写 | |
| 3 | r(?i:uby) |
同上 | |
| 4 | `rub(?:y | le))` | 仅组合而不创建\1反向引用 |