本文建议有一定正则基础的看
正则表达式可以包含普通或者特殊字符。绝大部分普通字符,比如 ‘A’, ‘a’, 或者 ‘0’,都是最简单的正则表达式。它们就匹配自身。有些字符,比如 ‘|’ 或者 ‘(’,属于特殊字符。 特殊字符既可以表示它的普通含义, 也可以影响它旁边的正则表达式的解释。
重复修饰符 (* , +, ?, {m,n}, 等) 不能直接嵌套。这样避免了非贪婪后缀 ? 修饰符,和其他实现中的修饰符产生的多义性。要应用一个内层重复嵌套,可以使用括号。 比如,表达式 (?:a{6})* 匹配6个 ‘a’ 字符重复任意次数。
特殊字符:
.
:点在默认模式,匹配除了换行的任意字符,如果指定了标签DOTALL
,他将匹配包括换行符的任意字符。
^
:插入符匹配字符串的开头,并且在MULTILINE
模式也匹配换行后的首个符号
$
:匹配字符串尾或者换行符的前一个字符,在MULTILINE
模式匹配换行符的前一个字符。
*
:对它前面的正则式匹配0到任意次重复,尽量多的匹配字符串。ab* 会匹配’a’,‘ab’,或者‘a’后面跟着任意个‘b’
+
:对它前面的正则匹配1到任意次重复。ab+会匹配‘a’后面跟随1个以上到任意个‘b’。
?
:对它前面的正则式匹配0到1次重复。ab?会匹配‘a’或者‘ab’。
*?
,+?
,??
: ‘* ’,‘+’,’?'修饰符都是贪婪的,他们在字符串进行尽可能多的匹配。有时候并不需要这种行为。在修饰符之后添加 ? 将使样式以非贪婪方式或者 :dfn:`最小 方式进行匹配; 尽量 少 的字符将会被匹配。
用正则式<.>、<.?> 分别匹配< a> b < c>
结果完全不同,第一种它将完全匹配,因为贪婪。第二个正则式将匹配< a>
{m}
:对之前的正则式指定匹配m个重复。
{m,n}
:对正则式进行m到n次匹配,在m、n之间取尽量多
{m,n}?
:前一个修饰符的非贪婪模式,只匹配尽量少的字符次数。比如:‘aaaaaa’,a{3,5}匹配5个’a’,而a{3,5}?只匹配3个‘a’
[]
:表示一个字符集合,在一个集合中:
· 字符可以单独列出,比如[amk]匹配‘a’,'m’或者‘k’
· 可以表示字符范围,通过用‘-’将两个字符连起来,比如[a-z]将匹配任何小写ASCII字符,[0-5][0-9]将匹配从00 到59的两位数子。 [0-9A-Fa-f] 将匹配任何十六进制数位。
· 特殊字符在集合中,将失去他的特殊含义。比如[(+* )]只会匹配这几个字符:‘(’, ‘+’, ’ * ', ‘)’
· 不在集合范围内的字符可以通过取反来进行匹配,如果集合首字符是‘^’,所有不在集合内的字符将会匹配,比如 [^5] 将匹配除5之外的所有字符。除了 ‘5’, [^^] 将匹配所有字符,除了 ‘^’. ^ 如果不在集合首位,就没有特殊含义。
re模块内容
模块定义了几个函数、常量和一个例外。
1.re.compile(pattern,flags=0)
将正则表达式的样式编译成为一个正则表达式对象,可以用于匹配,通过这个对象的方法match(),search()。
序列
m = re.compile(pattern)
result = m.match(string)
等价于
result = re.match(pattern, string)
2.re.search(pattern, string, flags=0)
扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象。如果没有匹配,就返回一个 None ; 注意这和找到一个零长度匹配是不同的。
3.re.match(pattern, string, flags=0)
如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的 匹配对象 。 如果没有匹配,就返回 None ;注意它跟零长度匹配是不同的。
注意即便是 MULTILINE 多行模式, re.match() 也只匹配字符串的开始位置,而不匹配每行开始。
如果你想定位 string 的任何位置,使用 search() 来替代(也可参考 search() vs. match() )