元字符
\b:代表单词的开头或结尾,为单词的交界处;虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。.:匹配除了换行符以外的任意字符。*:代表的是数量——它指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配,匹配重复任意次(可能是0次)。.*:任意数量的不包含换行的字符。+:同*,但匹配重复1次或更多次。-不是元字符,只匹配它本身——连字符(或者减号,或者中横线,或者随你怎么称呼它)。
字符转义
如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\.
后向引用
后向引用用于重复搜索前面某个分组匹配的文本。如匹配go go或自己指定子表达式的组名
零宽断言
-
零宽度正预测先行断言:(?=exp),它断言自身出现的位置的后面能匹配表达式exp。 例:\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分);搜索I'm singing while you're dancing.,匹配sing和danc。 -
零宽度正回顾后发断言:(?<=exp),它断言自身出现的位置的前面能匹配表达式exp。 例:(?<=\bre)\w+\b,匹配以re开头的单词的后半部分(除了re以外的部分);搜索reading a book,匹配ading。 例:((?<=\d)\d{3})+\b,要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),查找需要在前面和里面添加逗号的部分;搜索1234567890,匹配234567890。 例:(?<=\s)\d+(?=\s),匹配以空白符间隔的数字(再次强调,不包括这些空白符)。 -
负向零宽断言:只是想要确保某个字符没有出现,但并不想去匹配它。 例:\b\w*q[^u]\w*\b,匹配里面出现了字母q,但是q后面跟的不是字母u的单词;搜索Iraq,Benq,匹配Iraq。 -
零宽度负预测先行断言:(?!exp),断言此位置的后面不能匹配表达式exp。 例:\d{3}(?!\d),匹配三位数字,而且这三位数字的后面不能是数字。 例:\b((?!abc)\w)+\b,匹配不包含连续字符串abc的单词。 -
零宽度负回顾后发断言:(?<!exp),断言此位置的前面不能匹配表达式exp。 例:(?<![a-z])\d{7},匹配前面不是小写字母的七位数字。 -
例:(?<=<(\w+)>).*(?=<\/\1>),匹配不包含属性的简单HTML标签内里的内容。 (?<= # 断言要匹配的文本的前缀
<(\w+)> # 查找尖括号括起来的内容
# (即HTML/XML标签)
) # 前缀结束
.* # 匹配任意文本
(?= # 断言要匹配的文本的后缀
<\/\1> # 查找尖括号括起来的内容
# 查找尖括号括起来的内容
) # 后缀结束
贪婪与懒惰
- 规则:最先开始的匹配拥有最高的优先权。
- 贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。
例:a.*b,匹配最长的以a开始,以b结束的字符串;搜索aabab,匹配整个字符串aabab。 - 懒惰匹配:匹配尽可能少的字符。
- 例:
a.*?b,匹配最短的,以a开始,以b结束的字符串;搜索aabab,匹配aab。
| 查找项 | 正则表达式 |
|---|
hi | \bhi\b | hi后面不远处跟着一个Lucy | \bhi\b.*\bLucy\b | 匹配1个或更多连续的数字 | \d+ | 填写的QQ号必须为5位到12位数字 | ^\d{5,12}$ | 匹配3位区号的电话号码 | \(0\d{2}\d)[- ]?\d{8}|0\d{2}[- ]?\d{8} | 描述一个正确的IP地址 | ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) | kitty kitty或者go go | \b(\w+)\b\s+\1\b | | 自己指定子表达式的组名 | \b(?<Word>\w+)\b\s+\k<Word>\b |
尚未详细讨论的语法
| 代码/语法 | 说明 |
|---|
\a | 报警字符(打印它的效果是电脑嘀一声) | \b | 通常是单词分界位置,但如果在字符类里使用代表退格 | \t | 制表符,Tab | \r | 回车 | \v | 竖向制表符 | \f | 换页符 | \n | 换行符 | \e | Escape | \0nn | ASCII代码中八进制代码为nn的字符 | \xnn | ASCII代码中十六进制代码为nn的字符 | unnnn | Unicode代码中十六进制代码为nnnn的字符 | \cN | ASCII控制字符。比如\cC代表Ctrl+C | \A | 字符串开头(类似^,但不受处理多行选项的影响) | \Z | 字符串结尾或行尾(不受处理多行选项的影响) | \z | 字符串结尾(类似$,但不受处理多行选项的影响) | \G | 当前搜索的开头 | \p{name} | Unicode中命名为name的字符类,例如\p{IsGreek} | (?>exp) | 贪婪子表达式 | (?<x>-<y>exp) | 平衡组 | (?im-nsx:exp) | 在子表达式exp中改变处理选项 | (?im-nsx) | 为表达式后面的部分改变处理选项 | (?(exp)yes|no) | 把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no | (?(exp)yes) | 同上,只是使用空表达式作为no | (?(name)yes|no) | 如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no | (?(name)yes) | 同上,只是使用空表达式作为no |
模块中的核心函数
| 函数 | 说明 |
|---|
compile(pattern, flags=0) | 编译正则表达式返回正则表达式对象 | match(pattern, string, flags=0) | 用正则表达式匹配字符串 成功返回匹配对象 否则返回None | search(pattern, string, flags=0) | 搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None | split(pattern, string, maxsplit=0, flags=0) | 用正则表达式指定的模式分隔符拆分字符串 返回列表 | sub(pattern, repl, string, count=0, flags=0) | 用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数 | fullmatch(pattern, string, flags=0) | match函数的完全匹配(从字符串开头到结尾)版本 | findall(pattern, string, flags=0) | 查找字符串所有与正则表达式匹配的模式 返回字符串的列表 | finditer(pattern, string, flags=0) | 查找字符串所有与正则表达式匹配的模式 返回一个迭代器 | purge() | 清除隐式编译的正则表达式的缓存 | re.I / re.IGNORECASE | 忽略大小写匹配标记 | re.M / re.MULTILINE | 多行匹配标记 | re.S / re.SINGLELINE | 单行匹配标识 | IgnorePatternWhitespace | 忽略空白匹配 | ExplicitCapture | 显式捕获,仅捕获已被显式命名的组 |
总结
| 符 号 | 解释 | 示例 | 说明 |
|---|
. | 匹配任意字符 | b.t | 可以匹配bat / but / b#t / b1t等 | \w | 匹配字母/数字/下划线 | b\wt | 可以匹配bat / b1t / b_t等,但不能匹配b#t | \s | 匹配空白字符(包括\r、\n、\t等) | love\syou | 可以匹配love you | \d | 匹配数字 | \d\d | 可以匹配01 / 23 / 99等 | \b | 匹配单词的边界 | \bThe\b | | ^ | 匹配字符串的开始 | ^The | 可以匹配The开头的字符串 | $ | 匹配字符串的结束 | .exe$ | 可以匹配.exe结尾的字符串 | \W | 匹配非字母/数字/下划线 | b\Wt | 可以匹配b#t / b@t等,但不能匹配but / b1t / b_t等 | \S | 匹配非空白字符 | love\Syou | 可以匹配love#you等,但不能匹配love you | \D | 匹配非数字 | \d\D | 可以匹配9a / 3# / 0F等 | \B | 匹配非单词边界 | \Bio\B | | [] | 匹配来自字符集的任意单一字符 | [aeiou] | 可以匹配任一元音字母字符 | [^] | 匹配不在字符集中的任意单一字符 | [^aeiou] | 可以匹配任一非元音字母字符 | * | 匹配0次或多次 | \w* | | + | 匹配1次或多次 | \w+ | | ? | 匹配0次或1次 | \w? | | {N} | 匹配N次 | \w{3} | | {M,} | 匹配至少M次 | \w{3,} | | {M,N} | 匹配至少M次至多N次 | \w{3,6} | | | | 分支 | foo|bar | 可以匹配foo或者bar | (?#) | 注释 | | | (exp) | 匹配exp并捕获到自动命名的组中 | | | (?<name>exp) | 匹配exp并捕获到名为name的组中 | | | (?:exp) | 匹配exp但是不捕获匹配的文本 | | | (?=exp) | 匹配exp前面的位置 | \b\w+(?=ing) | 可以匹配I'm dancing中的danc | (?<=exp) | 匹配exp后面的位置 | (?<=\bdanc)\w+\b | 可以匹配I love dancing and reading中的第一个ing | (?!exp) | 匹配后面不是exp的位置 | | | (?<!exp) | 匹配前面不是exp的位置 | | | *? | 重复任意次,但尽可能少重复 | a.*b,a.*?b | 将正则表达式应用于aabab,前者会匹配整个字符串aabab,后者会匹配aab和ab两个字符串 | +? | 重复1次或多次,但尽可能少重复 | | | ?? | 重复0次或1次,但尽可能少重复 | | | {M,N}? | 重复M到N次,但尽可能少重复 | | | {M,}? | 重复M次以上,但尽可能少重复 | | |
注意:如果需要匹配的字符是正则表达式中的特殊字符,那么可以使用\进行转义处理,例如想匹配小数点可以写成\.就可以了,因为直接写.会匹配任意字符;同理,想匹配圆括号必须写成\(和\),否则圆括号被视为正则表达式中的分组。
超好用的测试正则的软件
百度网盘下载链接:https://pan.baidu.com/s/11jF03jPcrGxgGhNgciB6qQ; 提取码:nz29。
|