元字符
\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。
|