Note:本学习笔记是根据小甲鱼的Python3如何优雅地使用正则表达式(详解一)整理而来的
正则表达式(Regular Expressions,也称REs)是一个高度专业化的编程语言。它被嵌入Python中,并通过re模块提供给程序用。使用正则表达式,需要指定一些规则来描述希望匹配的字符串集合。这些字符串集合可能包含英语句子,Email地址,需要的URL地址。Python的正则表达式引擎是用C语言写的,所以效率很高。
先来讲解一下元字符,它们并不能匹配自身,它们定义了字符类、子组匹配和模式重复次数等。
下边是元字符的完整列表:
. ^ $ * + ? { } [ ] \ | ( )
(1)先来讲解方括号[ ],它们指定一个字符类用于存放你需要匹配的字符集合,可以单独列出需要匹配的字符,也可以通过两个字符和一个横杆-指定匹配的范围。例如[abc]会匹配字符a,b,c;[a-c]可以实现相同的功能。
注意:元字符在方括号中不会触发“特殊功能”,在字符类中,它们只匹配自身。例如[a$]会匹配任何字符'a','$','$'是一个元字符,但在方括号中它不表示特殊含义,它只匹配'$'字符本身。
(2)你还可以匹配方括号中未列出的所有其他字符,做法是在类的开头添加一个脱字符号^,例如[^5]会匹配除了'5'之外的任何字符。
(3)最重要的元字符是反斜杠\了。跟Python的字符串规则一样,如果在反斜杠后边紧跟着一个元字符,那么元字符的“特殊功能”也不会被触发。当你需要匹配符号[或\,你可以在它们前面加上一个反斜杠,已消除它们的特殊功能:\[,\\。反斜杠后边跟一些字符还可以表示特殊的意义。
反斜杠后边跟元字符去除特殊功能,反斜杠后边跟普通字符实现特殊功能
\w匹配任何单词字符
\d匹配任何十进制数字,相当于类[0-9]
\D与\d相反,匹配任何非十进制数字的字符,相当于类[^0-9]
\s匹配任何空白字符(包括空格、换行符、制表符等),相当于类[\t\n\r\f\v]
\S与\s相反,匹配任何非空白字符,相当于类[^\t\n\r\f\v]
\w匹配任何单词字符
\W与\w相反
\b匹配单词的开始或结束
\B与\b相反
举例:[\s,.]是一个字符类,它将匹配任何空白字符(/s的特殊含义),','或'.'。
(4)元字符. ,它匹配除了换行符以外的任何字符,如果设置了re.DOTALL标志,它匹配换行符在内的任何字符。
[size=18px]重复功能[/size]
正则表达式可以指定RE部分重复的次数。
1.元字符*用于指定前一个字符匹配零次或多次。如ca*t将匹配ct(0个字符a),cat(1个字符a),caaat(三个字符a)等等。
正则表达式默认的重复规则是贪婪的,当你重复匹配一个RE时,匹配引擎会尝试尽可能多的匹配,直到RE不匹配或者到了结尾,匹配引擎就会回退一个字符,然后再继续尝试匹配。
举个栗子 表达式a[bcd]*b,匹配字符串abcbd的结果是怎么样
步骤一:匹配a,匹配RE的第一个字符'a'
步骤二:匹配abcdb,引擎在符合规则的情况下尽可能的匹配[bcd]*,直到该字符串的结尾
步骤三:匹配失败,引擎尝试匹配RE最后一个字符'b',但当前位置已经是字符串的结尾,所以失败。
步骤四:匹配abcb,回退一个字符
步骤五:匹配失败,因为字符串最后一个字符是'd',不是RE中的最后一个字符'b'
步骤六:匹配abc,再次回退一个字符
步骤七:匹配abcb,匹配成功。
匹配结果是abcb
2. 元字符+,用于指定前一个字符匹配一次或多次。
注意:*和+的区别是,*匹配的是零次或多次,所以被重复的内容可能压根不会出现;+至少需要匹配一次,如ca+t不会匹配ct
3. 元字符?,用于指定前一个字符匹配零次或者一次,可以想成把前一个字符当成可选的内容,例如小?甲鱼可以匹配小甲鱼或者甲鱼。
4. 元字符{m,n}(m和n都是十进制整数),它的含义是前一个字符必须匹配m次到n次之间。例如a/{1,3}b会匹配a/b,a//b,a///b。也可以省略m或者n,如果是{,n}相当于{0,n};如果是{m,}相当于{m,无穷大},需要注意的是正则表达式里不能随便加空格。
*与{0,}等价
+与{1,}等价
?与{0,1}等价
但是还是鼓励大家记住* + ?,一方面是因为字符更短容易阅读,另一方面是因为匹配引擎对其做了优化,效率更高。
正则表达式(Regular Expressions,也称REs)是一个高度专业化的编程语言。它被嵌入Python中,并通过re模块提供给程序用。使用正则表达式,需要指定一些规则来描述希望匹配的字符串集合。这些字符串集合可能包含英语句子,Email地址,需要的URL地址。Python的正则表达式引擎是用C语言写的,所以效率很高。
先来讲解一下元字符,它们并不能匹配自身,它们定义了字符类、子组匹配和模式重复次数等。
下边是元字符的完整列表:
. ^ $ * + ? { } [ ] \ | ( )
(1)先来讲解方括号[ ],它们指定一个字符类用于存放你需要匹配的字符集合,可以单独列出需要匹配的字符,也可以通过两个字符和一个横杆-指定匹配的范围。例如[abc]会匹配字符a,b,c;[a-c]可以实现相同的功能。
注意:元字符在方括号中不会触发“特殊功能”,在字符类中,它们只匹配自身。例如[a$]会匹配任何字符'a','$','$'是一个元字符,但在方括号中它不表示特殊含义,它只匹配'$'字符本身。
(2)你还可以匹配方括号中未列出的所有其他字符,做法是在类的开头添加一个脱字符号^,例如[^5]会匹配除了'5'之外的任何字符。
(3)最重要的元字符是反斜杠\了。跟Python的字符串规则一样,如果在反斜杠后边紧跟着一个元字符,那么元字符的“特殊功能”也不会被触发。当你需要匹配符号[或\,你可以在它们前面加上一个反斜杠,已消除它们的特殊功能:\[,\\。反斜杠后边跟一些字符还可以表示特殊的意义。
反斜杠后边跟元字符去除特殊功能,反斜杠后边跟普通字符实现特殊功能
\w匹配任何单词字符
\d匹配任何十进制数字,相当于类[0-9]
\D与\d相反,匹配任何非十进制数字的字符,相当于类[^0-9]
\s匹配任何空白字符(包括空格、换行符、制表符等),相当于类[\t\n\r\f\v]
\S与\s相反,匹配任何非空白字符,相当于类[^\t\n\r\f\v]
\w匹配任何单词字符
\W与\w相反
\b匹配单词的开始或结束
\B与\b相反
举例:[\s,.]是一个字符类,它将匹配任何空白字符(/s的特殊含义),','或'.'。
(4)元字符. ,它匹配除了换行符以外的任何字符,如果设置了re.DOTALL标志,它匹配换行符在内的任何字符。
[size=18px]重复功能[/size]
正则表达式可以指定RE部分重复的次数。
1.元字符*用于指定前一个字符匹配零次或多次。如ca*t将匹配ct(0个字符a),cat(1个字符a),caaat(三个字符a)等等。
正则表达式默认的重复规则是贪婪的,当你重复匹配一个RE时,匹配引擎会尝试尽可能多的匹配,直到RE不匹配或者到了结尾,匹配引擎就会回退一个字符,然后再继续尝试匹配。
举个栗子 表达式a[bcd]*b,匹配字符串abcbd的结果是怎么样
步骤一:匹配a,匹配RE的第一个字符'a'
步骤二:匹配abcdb,引擎在符合规则的情况下尽可能的匹配[bcd]*,直到该字符串的结尾
步骤三:匹配失败,引擎尝试匹配RE最后一个字符'b',但当前位置已经是字符串的结尾,所以失败。
步骤四:匹配abcb,回退一个字符
步骤五:匹配失败,因为字符串最后一个字符是'd',不是RE中的最后一个字符'b'
步骤六:匹配abc,再次回退一个字符
步骤七:匹配abcb,匹配成功。
匹配结果是abcb
2. 元字符+,用于指定前一个字符匹配一次或多次。
注意:*和+的区别是,*匹配的是零次或多次,所以被重复的内容可能压根不会出现;+至少需要匹配一次,如ca+t不会匹配ct
3. 元字符?,用于指定前一个字符匹配零次或者一次,可以想成把前一个字符当成可选的内容,例如小?甲鱼可以匹配小甲鱼或者甲鱼。
4. 元字符{m,n}(m和n都是十进制整数),它的含义是前一个字符必须匹配m次到n次之间。例如a/{1,3}b会匹配a/b,a//b,a///b。也可以省略m或者n,如果是{,n}相当于{0,n};如果是{m,}相当于{m,无穷大},需要注意的是正则表达式里不能随便加空格。
*与{0,}等价
+与{1,}等价
?与{0,1}等价
但是还是鼓励大家记住* + ?,一方面是因为字符更短容易阅读,另一方面是因为匹配引擎对其做了优化,效率更高。