正则表达式对比工具
https://pan.baidu.com/s/1XIPyF1vFSj5PACPx9zW8_g
(一) 正则表达式符号和特殊字符
符号 | 说明 | 示例 |
---|---|---|
| | 或 | re1|re2,匹配re1或re2 |
. | 匹配任何字符(\n除外) | |
^ | 匹配字符串开始部分 | ^ab.* 以ab开始的字符串,匹配ab123、ababc等等 |
$ | 匹配字符串结束部分 | .*123$ 以123结束的字符串,匹配ab123、测试123等等 |
* | 匹配0次或多次前面的正则表达式 | .* 匹配0次或多次前面的 . |
+ | 匹配1次或多次前面的正则表达式 | |
? | 匹配0次或1次前面的正则表达式 | |
{n} | 匹配n次前面的正则表达式 | .{5} |
{m,n} | 匹配M到N次前面的正则表达式 | .{1,10} |
[…] | 匹配[]里的任一字符 | [abc]d 匹配 ad、bd、cd |
[x-y] | 匹配范围内的任一字符 | [a-c]d:匹配 ad、bd、cd [0-9]d:匹配0d、1d、2d、3d等 |
[^…] | 不匹配[]里的任一字符 | [^a-c]d: 不匹配 ad、bd、cd |
(…) | 将正则表达式封闭为一个组 | 例如:[a-b][a-b] :只匹配aa、ab等 ([a-b][a-b])+:匹配aaaa、abab等 |
符号 | 说明 | 示例 |
---|---|---|
\d | 匹配任一数字,和[0-9]是一样的,\D则不匹配任何数字 | A\d: 匹配A1、A2等 |
\w | 匹配任一数字、字母,和[A-Za-z0-9]是一样的,\W则相反 | |
\s | 匹配任一空格字符,\S 则相反 | hello\sword:匹配hello word |
\.. | 将\后一个字符按字面意义匹配,不匹配特殊含义 | \?:匹配? \\d:匹配\d |
\b | 匹配任何单词边界(\B 则相反) | 例如:字符串 ab the Htherr the: 能匹配到2个 the \bthe\b:只匹配第一个 the \Bthe\B:只匹配第二个 the |
\A | 匹配字符串开始部分,\Z 则字符串结束部分 | 参照^ 和$ |
(二) 贪婪模式和非贪婪模式
贪婪模式:尽可能的匹配
非贪婪模式:匹配到第一个结果后就结束匹配。在*、+、?、{}后面加一个?就是非贪婪模式。(*|+|?|{})?
看下面2张图就清楚了(蓝色背景表示匹配的内容)
第一张图(贪婪模式):匹配到第一</div>后还会继续向右匹配。(在内容和正则表达式匹配的情况下,尽可能的匹配最长字符串)
第二张图(非贪婪模式):匹配到第一个</div>后就结束匹配了。(在内容和正则表达式匹配的情况下,匹配到第一个结果后就结束匹配)
(三) re模块
函数/方法 | 说明 |
---|---|
re.compile(pattern, flags=0) | (预编译)将正则表达式编译为对象(不是必须的,不过一般是会预编译) 实际应用中:下面2种方式都是可以用的 the_str='' 第一: href_regx= re.compile('<div.*</div>') href_regx.match(the_str) 第二: re.match('<div.*</div>',the_str) 第一种是调用正则表达式对象的match()方法。 第二种写法是调用re模块的match()函数 |
match(pattern, string) | Pattern:正则表达式 String:字符串 匹配成功,返回字符串,失败则返回None。 预编译后的正则表达式对象则只需要传str就行了(因为它本身就是pattern对象) |
search(pattern, string) | Pattern:正则表达式 String:字符串 返回第一个匹配内容,没有匹配则返回None |
findall(pattern, string) | 以列表形式返回所有匹配的内容 |
finditer(pattern, string) | 返回所有匹配的内容,以迭代器的形式 |
split(pattern, string) | Pattern匹配的内容作为分隔符,split将字符串分割为列表并返回 |
flags参数 | 说明 |
---|---|
re.I re.IGNORECASE | 不区分大小写 |
re.M re.MULTILINE | 匹配行的开始和结束部分,而不是严格匹配字符串本身的开始、结束部分 |
re.S re.DOTALL) | 让. (点号)可以匹配\n |
使用flags参数的时候,不清楚传第几个参数的话,最好先去看下方法(函数)的实现代码。
(四) re模块示例
1 import re
2 the_str='<div id="hd_info"></div></div></div>'
3 href_regx= re.compile('<div.*</div>')
4 print('match()示例:',href_regx.match(the_str))
5 print('match()示例:',re.match('<div.*</div>',the_str))
6 print('search()示例:',re.search('/div>',the_str))
7
8 print('findall()示例:',re.findall('/div>',the_str))
9 print('finditer()示例:',re.finditer('/div>',the_str))
10 for i in re.finditer('/div>',the_str):
11 print('迭代finditer()返回值:',i)
12
13 print('split()示例:',re.split('/.',the_str,re.DOTALL))
(五) 正则表达式实际应用
匹配电信手机号
正则表达式:1(39|49|53|[7][37]|[8][019]|99)[0-9]{8}
匹配a标签开始 href属性值 (<a href='' )