元字符
单行模式:
. 可以匹配所有字符,包括换行符
^代表整个字符串的开头,$代表整个字符串的结尾
多行模式:
.可以匹配换行符之外的字符
^代表行首即整个字符串的开始,$代表行尾即整个字符串的结尾,开始指的是\n后紧接着的字符,结束指的是\n前的字符(此处需注意windows下换行符为\r\n,因此匹配结果时候需要加上\r,比如匹配以e结尾的行为:"e\r$")
例如字符串:
"""aaa
bbb
000
"""
单行模式"^b.*" 匹配失败,而多行模式"^b.*"可以匹配到第二行数据,由此可见,单行模式是将整个字符串看成一行。
捕获
(pattern)
说明:a. 使用小括号制定一个子表达式,也叫分组,捕获后会自动分组号从1开始;b. 可以改变优先级,分组号为0的表示匹配的整个字符串而不是括号中的内容
\数字
说明:匹配对应的分组
举例:"(very) \1" 匹配"very very",但捕获的组group是very
(?:pattern)
说明:如果仅仅为了改变优先级,就不需要捕获分组
举例:(?:w|f)ood 等价于"wood|food"
(?<name>exp)
(?'name'exp)
说明:分组捕获,但是可以通过name访问分组,python语法必须是(?P<name>exp)
零宽断言
(?=exp)
说明:零宽度正预测先行断言,断言exp一定在匹配的右边出现,也就是说断言后面一定跟一个exp
举例:f(?=oo) f后面一定有oo出现
(?<=exp)
说明:零宽度正回顾后发断言,断言exp一定出现在匹配的左边,也就是说前面一定有个exp
举例:(?<=f)ood、(?<=t)ook 分别匹配ood、ook、ook之前一定有t出现
负向零宽断言
(?!exp)
说明:零宽度负预测先行断言,断言exp一定不会再匹配的右边出现,也就是说断言后面一定不是exp
举例:f(?!oo) f后面一定不会有oo出现
(?<!exp)
说明:零宽度负回顾后发断言,断言exp一定不会出现在匹配的左边,也就是说前面一定不会有个exp
(?#comment)
说明:注释
贪婪与非贪婪
贪婪:默认是贪婪模式,尽量多匹配更长的字符串
非贪婪:在重复的符号后面加上一个问号,比如:*?、+?、??、{n,}?、{n,m}?
例1: "f.*t" 匹配字符串"feed foot abbd get" 会匹配到"foot abbd get" ---贪婪
"f.*?t" 匹配字符串"feed foot abbd get" 会匹配到"foot" ---非贪婪
IgnoreCase
匹配时忽略大小写,python中为re.I、re.IGNORECASE
Singleline
单行模式:可以匹配所有字符,包括'\n',python中为:re.S,re.DOTAIL
Multiline
多行模式:^行首,$行尾,python中为:re.M,re.MULTILINE
IgnorePatternWhitespace
忽略表达式中的空白字符,如果要使用空白字符用转义,#可以用来做注释,python为:re.X,re.VERBOSE