正则表达式
对于字符串匹配操作,最强大的工具还是正则表达式,但是如果不经常使用很容易忘记,还是需要多使用,掌握了正则表达式入门就可以满足工作中大部分的使用场景;如果想深入了解,可以参考正则表达式高级用法
Python语言中有专门的模块可以方便使用正则表达式来实现复杂的字符串操作,正式本文的主角--re模块
比较常用的使用方法
- 先调用
re
模块的compile
方法,将正则表达式字符串编译成一个正则表达式对象
re.compile(pattern, flags=0)
- 调用
正则表达式对象
的方法来实现匹配、查找、替换等操作
说明:
re
模块中定义了与正则表达式对象
中方法同名的函数,可以实现同样的功能。如果需要多次使用这个正则表达式的话,使用re.compile()
和保存这个正则对象以便复用,可以让程序更加高效。
例如:
prog = re.compile(pattern)
result = prog.match(string)
等价于
result = re.match(pattern, string)
常用的接口总结
Flag变量
变量名 | 说明 |
---|---|
re.A 、re.ASCII
|
让 \w, \W, \b, \B, \d, \D, \s 和 \S 只匹配ASCII,而不是Unicode。这只对Unicode样式有效,会被byte样式忽略。相当于前面语法中的内联标志 (?a) 。 |
re.I 、re.IGNORCASE
|
进行忽略大小写匹配;相当于内联标记 (?i) 。 |
re.L 、re.LOCALE
|
由当前语言区域决定\w, \W, \b, \B 和大小写敏感匹配。这个标记只能对byte样式有效。对应内联标记(?L)
|
re.M 、re.MULTILINE
|
样式字符 ^ 匹配字符串的开始,和每一行的开始(换行符后面紧跟的符号);样式字符 $ 匹配字符串尾,和每一行的结尾(换行符前面那个符号)。对应内联标记 (?m)
|
re.S 、re.DOTALL
|
让 '.' 特殊字符匹配任何字符,包括换行符;如果没有这个标记,'.' 就匹配 除了 换行符的其他任意字符。对应内联标记(?s) 。 |
re.S 、re.DOTALL
|
这个标记允许你编写更具可读性更友好的正则表达式。通过分段和添加注释。空白符号会被忽略。对应内联标记 (?x) 。 |
re.DEBUG |
显示编译时的debug信息,没有内联标记。 |
接口
函数名 | 方法名 | 说明 |
---|---|---|
re.search(pattern, string, flags=0) | Pattern.search(string[, pos[, endpos]]) | 扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象 。找不到就返回一个 None 。 |
re.match(pattern, string, flags=0) | Pattern.match(string[, pos[, endpos]]) | 如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的 匹配对象 。找不到就返回一个 None 。 |
re.fullmatch(pattern, string, flags=0) | Pattern.fullmatch(string[, pos[, endpos]]) | 与上个相比,要整个 string 匹配才可以。 |
re.split(pattern, string, maxsplit=0, flags=0) | Pattern.split(string, maxsplit=0) | 用 pattern 分开 string 。 |
re.findall(pattern, string, flags=0) | Pattern.findall(string[, pos[, endpos]]) | 查找所有匹配项,每个匹配项都不重叠,返回一个字符串列表;当pattern 中有捕获组时返回元组列表。 |
re.finditer(pattern, string, flags=0) | Pattern.finditer(string[, pos[, endpos]]) | 功能同上,返回的是一个迭代器。 |
re.sub(pattern, repl, string, count=0, flags=0) | Pattern.sub(repl, string, count=0) | 返回通过使用 repl 替换在 string 最左边非重叠出现的 pattern 而获得的字符串。 如果样式没有找到,则不加改变地返回 string。 repl 可以是字符串或函数。 |
re.subn(pattern, repl, string, count=0, flags=0) | Pattern.subn(repl, string, count=0) | 同上,但是返回一个元组 (字符串, 替换次数)。 |
独有特性
-
re
模块函数- 转义 pattern 中的特殊字符,常用于对任意可能包含正则表达式元字符的文本字符串进行匹配时。函数原型:
re.escape(pattern)
-
re.purge()
清除正则表达式的缓存。 -
re.error(msg, pattern=None, pos=None)
当传递给函数的正则表达式不合法(比如括号不匹配),或者在编译或匹配过程中出现其他错误时,会引发异常。
- 转义 pattern 中的特殊字符,常用于对任意可能包含正则表达式元字符的文本字符串进行匹配时。函数原型:
-
正则表达式对象
的方法-
Pattern.flags
正则匹配标记。这是可以传递给re.compile
的参数 -
Pattern.groups
捕获到的模式串中组的数量。 -
Pattern.groupindex
映射由(?P<id>)
定义的命名符号组合和数字组合的字典。如果没有符号组,那字典就是空的。 -
Pattern.pattern
编译对象的原始样式字符串。
-
search() vs. match()
-
match()
检查字符串开头;search()
检查字符串的任意位置。 - 在多行模式字符串中,
match()
也只匹配整个字符串的开始位置,而不会匹配每一行的开始;而search()
或者以^
开始的正则表达式会匹配每行的开始。
理论上search()
是可以替换match()
网友评论