python中正则使用方式
正则表达式常用的匹配规则
模式 | 描述 |
---|---|
****一般字符**** | |
. | 匹配除换行符"\n"和"\r"之外的任意字符,在re.S模式下则能匹配任意字符 |
\ | 转义字符,使下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符,如果原始字符串中含有* . ? + $ ^ [ ] ( ) { } | \ ,需要在前面加转义字符\才能正确表示,或者在字符串前面加个r房子转义 |
[…] | 字符集,用来表示一组字符,对应的位置可以是字符集中任意一个字符,字符集中的字符可以逐个列出,也可以给出范围如[abc]或[a-c],所有的特殊字符在字符集中都失去本原有的含义,需要加\进行转义;常见的字符集[0-9]、[a-z]、[A-Z]、^[\u4e00-\u9fa5]*$ |
[^…] | 在字符集内的开头加入非,表示匹配不在字符集内的其他任意字符,如[^abc]表示匹配除abc之外的任意字符 |
****预定义字符集(可以写在字符集[…]中)**** | |
\d | 匹配任意数字,等价于[0-9] |
\D | 匹配任意非数字的字符,等价于[^\d] |
\s | 匹配空白字符,等价于[\t\n\r\f],如\t(Tab)、\r(回车)、’ '(空格)、\f(换页符)、\n(换行符)、\v(垂直制表符) |
\S | 匹配非空白字符,等价于[^\s] |
\w | 匹配字母数字及下划线,等价于[A-Za-z0-9_] |
\W | 匹配非字母数字及下划线的其他字符,等价于[^A-Za-z0-9_] |
****数量词(用在字符或(…)之后)**** | |
* | 匹配前一个字符、子表达式0次或多次,例如abc* 能匹配ab,也能匹配abc、abcc,*等价于{0,} |
+ | 匹配前一个字符、子表达式1次或多次,例如abc+ ,能匹配abc、abcc,但是不能匹配到ab,+号前的字符至少要匹配一次,+等价于{1,} |
? | 匹配前一个字符、子表达式0次或1次,例如do(es)? 可以匹配到do或does,?等价于{0,1} |
{n} | 精确匹配前一个字符、子表达式n次,例如ab{2}c 可以匹配到abbc,n为非负整数 |
{n,} | 匹配前一个字符、子表达式至少n次(即[n,+∞]),例如ab{2,}c 可以匹配到abbc或abbbbbbbc,n为非负整数 |
{,n} | 匹配前一个字符、子表达式至多n次(即[0,n]),例如ab{,2}c 可以匹配到ac、abc或abbc,n为非负整数 |
{n,m} | 匹配前一个字符、子表达式最少匹配n次,最多m次(即[n,m]),例如ab{1,2}c 可以匹配到abc或abbc,n, m为非负整数,且n<=m |
*?, +?, ?? |
默认情况下*、+和?的匹配模式是贪婪模式,即会尽可能对的匹配符合规则的字符,*?、+?和??表示启用对应的非贪婪模式。如对于字符串"Pythonnn",正则表达式Python+能匹配大整个字符串,而Python+?则匹配Python |
{n,m}? |
同上,启用非贪婪模式,即只匹配n次,n, m为非负整数,且n<=m |
****边界匹配(不消耗待匹配字符串中的字符)**** | |
^ | 匹配字符串的开头,在多行模式下(re.M)匹配每一行的开头,如^abc可以匹配abc |
$ | 匹配字符串的末尾,在多行模式下(re.M)匹配每一行的末尾,如abc$可以匹配abc |
\A | 仅匹配字符串开头,如\Aabc可以匹配abc |
\Z | 仅匹配字符串末尾,如果存在换行,只匹配到换行前的结束字符串,如abc\Z可以匹配abc |
\z | 仅匹配字符串末尾,如果存在换行,同时还会匹配到换行符 |
\b | 匹配单词边界,也就是指单词和空格间的位置,如er\b 可以匹配到never中的er,但不能匹配到verb中的er |
\B | 匹配非单词边界,也就是指单词和空格间的位置,如er\B 可以匹配到verb中的er,但不能匹配到never中的er,等价于[^\b] |
\G | 匹配最后匹配完成的位置 |
****逻辑、分组**** | |
| |
左右表达式任意匹配一个,类似于"或"。总是先尝试匹配左边的表达式,一旦成功匹配就跳过匹配右边的表达式;如果| 没有被包括在()中,则它的范围是整个表达式。如123|456 能匹配到123、456 |
(…) | 匹配圆括号中的正则表达式,或者指定一个子组的开始和结束位置,被括起来的表达式将作为分组,从表达式的左边开始每遇到一个分组的左括号’(’,编号+1;另外分组表达式作为一个整体,后面可以接数量词;表达式中的| 也只能在该组中生效。如(abc){2} 能匹配到abcabc ,而a(123|456)c 能匹配到a123c、a456c |
(?P<name>...) |
给分组命名,除了愿有你的编号外在指定一个额外的别名,通过分组名字name既可以访问到子组匹配的字串,例如(?P<id>abc){2} 能够匹配到abcabc |
\<number> |
引用序号为<number> 对应的子组所匹配到的字符串,子组的序号从1开始计算;如果序号以0开头,或者3个数字的长度,那么不会被引用对应的子组,而是用于匹配八进制数字所表示的ASCII码值所对应的字符。例如(.+) \1 会匹配"python python" 或 “66 66”,但不会匹配holysll" |
(?P=name) |
引用别名为<name> 的分组匹配到的字符串,如(?P<id>\d)abc(?P=id) 能够匹配到1abc1、5abc5 |
****特殊构造(不作为分组)**** | |
(?:...) |
(…)的不分组版本,用于使用| 或后接数量词。如(?:abc){2} 能匹配abcabc |
(?aiLmsux) |
aiLmsux的每个字符代表一种匹配模式,(? 后可以紧跟着 ‘a’,‘i’,‘L’,‘m’,‘s’,‘u’,‘x’ 中的一个或多个字符,只能在正则表达式的开头使用,如(?i)abc 匹配模式是忽略大小写,能够匹配abc、Abc、aBc、abC、ABc、AbC、aBC、ABC |
(?#...) |
#后的内容将作为主食被忽略,如abc(?#comment)123 能够匹配abc123 |
(?=...) |
之后的字符串内容需要匹配表达式才能匹配成功,不消耗字符创的内容。如a(?=\d) 能匹配后面全是数字的a |
(?!...) |
之后的字符串内容需要不匹配表达式才能匹配成功,不消耗字符创的内容。如a(?!\d) 能匹配后面不是数字的a |
(?<=...) |
之前的字符串内容需要匹配表达式才能匹配成功,不消耗字符创的内容。如a(?<=\d) 能匹配前面是数字的a |
(?<!...) |
之前的字符串内容需要不匹配表达式才能匹配成功,不消耗字符创的内容。如a(?<!\d) 能匹配后面不是数字的a |
(?(id/name)yes-pattern|no-pattern) |
如果序号为id/别名为name的组匹配到字符,则需要尝试yes-patteren匹配规则,否则需要尝试no-pattern匹配规则,no-pattern是可选可省略。如(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$) 是一个邮件格式的正则表达式,可以匹配<lucy@outlook.com> 和lucy@outlook.com ,但不会匹配<lucy@outlook.com 或lucy@outlook.com> |
正则表达式的匹配模式: