match()在官方文档中是这样定义的
如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的 匹配对象 。 如果没有匹配,就返回
None
;注意它跟零长度匹配是不同的。注意即便是
MULTILINE
多行模式,re.match()
也只匹配字符串的开始位置,而不匹配每行开始。如果你想定位 string 的任何位置,使用
search()
来替代
简而言之,match()方法是从字符串的开头开始匹配的,一旦开头不匹配,那么整个匹配就失败
search()在官方文档中是这样定义的
扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象。如果没有匹配,就返回一个
None
; 注意这和找到一个零长度匹配是不同的。
简而言之,search()在匹配时会扫描整个字符串,然后返回第一个重新匹配的结果,也就是说,正则表达式可以是字符串的一部分
findall()在官方文档中是这样定义的
findall
(pattern, string, flags=0)对 string 返回一个不重复的 pattern 的匹配列表, string 从左到右进行扫描,匹配按找到的顺序返回。
如果样式里存在一到多个组,就返回一个组合列表;就是一个元组的列表(如果样式里有超过一个组合的话)。空匹配也会包含在结果里。
简而言之,search()会搜索整个字符串,然后返回所有匹配内容。
sub()在官方文档中是这样定义的
re.
sub
(pattern, repl, string, count=0, flags=0)返回通过使用 repl 替换在 string 最左边非重叠出现的 pattern 而获得的字符串。 如果样式没有找到,则不加改变地返回 string。 repl 可以是字符串或函数;如为字符串,则其中任何反斜杠转义序列都会被处理。 也就是说,
\n
会被转换为一个换行符,\r
会被转换为一个回车附,依此类推。 未知的 ASCII 字符转义序列保留在未来使用,会被当作错误来处理。 其他未知转义序列例如\&
会保持原样。 向后引用像是\6
会用样式中第 6 组所匹配到的子字符串来替换。如果 repl 是一个函数,那它会对每个非重复的 pattern 的情况调用。这个函数只能有一个 匹配对象 参数,并返回一个替换后的字符串。
可选参数 count 是要替换的最大次数;count 必须是非负整数。如果忽略这个参数,或者设置为0,所有的匹配都会被替换。空匹配只在不相临连续的情况被更替,所以
sub('x*', '-', 'abxd')
返回'-a-b--d-'
。在字符串类型的 repl 参数里,如上所述的转义和向后引用中,
\g<name>
会使用命名组合name
,(在(?P<name>…)
语法中定义)\g<number>
会使用数字组;\g<2>
就是\2
,但它避免了二义性,如\g<2>0
。\20
就会被解释为组20,而不是组2后面跟随一个字符'0'
。向后引用\g<0>
把 pattern 作为一整个组进行引用。
是不是有点繁琐,其实蛮简单,我们主要用到前三个参数sub
(pattern, repl, string),后面可选参数很少用
简而言之,pattern是要匹配目标的正则表达式,reple是替换匹配目标的,string是正则表达式要匹配的文本。
compile()是将一个正则表达式编译成一个正则表达式对象,简而言之,就是将正则表达式内容封装起来。