正则总结
a、正则常用的方法:
| 方法 | 含义 |
|---|---|
| match() | 判断一个正则表达式是否从开始处匹配一个字符串 |
| search() | 遍历字符串,找到正则表达式匹配的第一个位置 |
| findall() | 遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回 |
| finditer() | 遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回 |
| sub() | sub(‘正则’,‘替换项’,待匹配) 就是将匹配到的部分,用替换项替换 |
| compile | compile(正则表达式) 将通用正则表达式转成一个正则对象,下面只需要使用这个就好。 比如a = re.compile(’\d{2}’) re.match(a,‘123你好啊’) re.match(a,‘4421我也好啊’) |
serarch 与match的区别:
有时候你可能会耍点小聪明,使用 re.match() 然后在 RE 的前边加上 .*。但尽量不要这么做,最好采用 re.search() 代替。正则表达式编译器会对 REs 做一些分析,以便可以在搜索匹配时提高速度。一般分析会先找到匹配的第一个字符是什么。举个例子,模式 Crow 必须从字符 ‘C’ 开始匹配,那么匹配引擎分析后会快速遍历字符串,然后在 ‘C’ 被找到之后才开始全部匹配。
按照上面的分析,你添加一个 .* 会导致这个优化失败,这就需要从头到尾扫描一遍,然后再回溯匹配 RE 剩余的部分。所以,请使用 re.search() 代替。
在匹配到的内容可以用一些常用方法查看一下
| 含义 | |
|---|---|
| group() | 返回匹配的字符串 |
| start() | 返回匹配的开始位置 |
| end() | 返回匹配的结束位置 |
| span() | 返回一个元组表示匹配位置(开始,结束) |
m = p.match('fishc')
>>> m.group()
'fishc'
>>> m.start()
0
>>> m.end()
5
>>> m.span()
(0, 5)
b、正则常用的特殊字符
| 特殊字符 | 含义 |
|---|---|
| \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 相反 |
c、正则常用的格式
| 字符 | 描述 |
|---|---|
| \ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n“匹配字符”n"。"\n“匹配一个换行符。串行”\\“匹配”\“而”\(“则匹配”("。 |
| ^ | 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n“或”\r"之后的位置。 |
| $ | 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n“或”\r"之前的位置。 |
| * | 匹配前面的子表达式零次或多次。例如,zo*能匹配“z“以及”zoo"。*等价于{0,}。 |
| + | 匹配前面的子表达式一次或多次。例如,“zo+“能匹配”zo“以及”zoo",但不能匹配"z"。+等价于{1,}。 |
| ? | 匹配前面的子表达式零次或一次。例如,“do(es)?“可以匹配”does“或”does“中的”do"。?等价于{0,1}。 |
| {n} | n是一个非负整数。匹配确定的n次。例如,“o{2}“不能匹配”Bob“中的”o",但是能匹配"food"中的两个o。 |
| {n,} | n是一个非负整数。至少匹配n次。例如,“o{2,}“不能匹配”Bob“中的”o",但能匹配"foooood“中的所有o。”o{1,}“等价于”o+"。"o{0,}“则等价于”o*"。 |
| {n,m} | m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}“将匹配”fooooood“中的前三个o。”o{0,1}“等价于”o?"。请注意在逗号和两个数之间不能有空格。 |
| ? | 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo","o+?“将匹配单个”o",而"o+“将匹配所有”o"。 |
| . | 匹配除“\n“之外的任何单个字符。要匹配包括”\n“在内的任何字符,请使用像”(.|\n)"的模式。 |
| (pattern) | 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(“或”\)"。 |
| (?:pattern) | 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)“来组合一个模式的各个部分是很有用。例如”industr(?:y|ies)“就是一个比”industry|industries"更简略的表达式。 |
| (?=pattern) | 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)“能匹配”Windows2000“中的”Windows",但不能匹配"Windows3.1“中的”Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
| (?!pattern) | 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)“能匹配”Windows3.1“中的”Windows",但不能匹配"Windows2000“中的”Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
| (?<=pattern) | 反向肯定预查,与正向肯定预查类拟,只是方向相反。例如,“(?<=95|98|NT|2000)Windows“能匹配”2000Windows“中的”Windows",但不能匹配"3.1Windows“中的”Windows"。 |
| (?<!pattern) | 反向否定预查,与正向否定预查类拟,只是方向相反。例如“(?<!95|98|NT|2000)Windows“能匹配”3.1Windows“中的”Windows",但不能匹配"2000Windows“中的”Windows"。 |
| x|y | 匹配x或y。例如,“z|food“能匹配”z“或”food"。"(z|f)ood“则匹配”zood“或”food"。 |
| [xyz] | 字符集合。匹配所包含的任意一个字符。例如,“[abc]“可以匹配”plain“中的”a"。 |
| [^xyz] | 负值字符集合。匹配未包含的任意字符。例如,“[^abc]“可以匹配”plain“中的”p"。 |
| [a-z] | 字符范围。匹配指定范围内的任意字符。例如,“[a-z]“可以匹配”a“到”z"范围内的任意小写字母字符。 |
| [^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]“可以匹配任何不在”a“到”z"范围内的任意字符。 |
贪婪模式:
.*或.+这样可以一直匹配,如果后面有可以匹配的就继续往下匹配。
非贪婪模式:
.*?或.+? 这样就只匹配一次,成功就结束了
示例:
s = '<html><head><title>Title</title>'
print(re.match('<.*>', s).group())
>>><html><head><title>Title</title>
print(re.match('<.*?>', s).group())
>>><html>
解析:
何为贪婪?何为不贪婪?
所谓的贪婪,指的只要还能匹配就一直往下匹配。
正如案例:re.match('<.*>', s)
其实,过程是这样的,首先匹配<然后匹配.*,所谓的.*指的是匹配空格或任意字符0次或多次,并且要以>后面的字符结束。其实意思就是首先匹配html然后后面有>结束,但由于是贪婪的,所以继续往下匹配,则当前匹配的是html><head此时有>结束,但由于是贪婪地,所以继续往下匹配,直到匹配到最后的title,这个时候后面的是>,所以匹配上。此时字符串结束,所以匹配的就是<html><head><title>Title</title>。
如果s = '<html><head><title>Title</title'
这样的话在贪婪模式中,匹配到title时,发现后面接着的是>,则继续往下匹配,直到匹配到/title(即字符串结尾)发现后面没有跟着>,所以表示现在贪婪的是不合法的,所以回退到最近一次合法的区域,即匹配的是:
<html><head><title>
非贪婪案例:re.match('<.*?>',s)
其实,过程是这样的,首先匹配<,然后匹配.*?,.*?指的是匹配空格或任意字符0次或多次,并且要以>后面的字符结束。由于是非贪婪的,所以当匹配到html发现后面的是>,就结束,不会继续往下匹配了。所以匹配的是
<html>
d、常用正则速查库
| 常用的格式 | |
|---|---|
| 用户名 | /1{3,16}$/ |
| 密码 | /2{6,18}$/ |
| 密码2 | (?=^.{8,}KaTeX parse error: Undefined control sequence: \d at position 7: )(?=.*\̲d̲)(?=.*\W+)(?=.*… (由数字/大写字母/小写字母/标点符号组成,四种都必有,8位以上) |
| 十六进制值 | /^#?([a-f0-9]{6}|[a-f0-9]{3})$/ |
| 电子邮箱 | /^([a-z0-9_.-]+)@([\da-z.-]+).([a-z.]{2,6})KaTeX parse error: Undefined control sequence: \d at position 9: / /^[a-z\̲d̲]+(\.[a-z\d]+)*…/或\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)* |
| URL | /^(https??/)?([\da-z.-]+).([a-z.]{2,6})([/\w .-])/?$/ 或 [a-zA-z]+://[^\s]* |
| IP 地址 | /((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/ /^(???:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ 或 ((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) |
| HTML 标签 | /<([a-z]+)([<]+)(?:>(.)</\1>|\s+/>)$/或<(.)(.)>.</\1>|<(.) /> |
| 删除代码\注释 | (?<!http:|\S)//.*$ |
| 匹配双字节字符(包括汉字在内) | [^\x00-\xff] |
| 汉字(字符) | [\u4e00-\u9fa5] |
| Unicode编码中的汉字范围 | /3+$/ |
| 中文及全角标点符号(字符) | [\u3000-\u301e\ufe10-\ufe19\ufe30-\ufe44\ufe50-\ufe6b\uff01-\uffee] |
| 日期(年-月-日) | (\d{4}|\d{2})-((0?([1-9]))|(1[1|2]))-((0?[1-9])|(12)|(3[0|1])) |
| 日期(月/日/年) | ((0?[1-9]{1})|(1[1|2]))/(0?[1-9]|([12][1-9])|(3[0|1]))/(\d{4}|\d{2}) |
| 时间(小时:分钟, 24小时制) | ((1|0?)[0-9]|2[0-3])?[0-5][0-9]) |
| 中国大陆固定电话号码 | (\d{4}-|\d{3}-)?(\d{8}|\d{7}) |
| 中国大陆手机号码 | 1\d{10} |
| 中国大陆邮政编码 | [1-9]\d{5} |
| 中国大陆身份证号(15位或18位) | \d{15}(\d\d[0-9xX])? |
| 非负整数(正整数或零) | \d+ |
| 正整数 | [0-9][1-9][0-9] |
| 负整数 | -[0-9][1-9][0-9] |
| 整数 | -?\d+ |
| 小数 | (-?\d+)(.\d+)? |
| 空白行 | \n\s*\r 或者 \n\n(editplus) 或者 4*\n |
| QQ号码 | [1-9]\d{4,} |
| 不包含abc的单词 | \b((?!abc)\w)+\b |
| 匹配首尾空白字符 | ^\s*|\s*$ |
| 编辑常用 | 以下是针对特殊中文的一些替换(editplus) 5.\n [第].\n 6.\n 7\n 8. 9\n <p[^<>]>href="javascript:if(confirm(’(.?)’))window.location=’(.?)’"<span style=".["]*rgb(255,255,255)">.[<>]
[\s\S]*?
|

本文深入探讨了正则表达式的各种用法,包括匹配、搜索、替换等核心方法,以及特殊字符、格式规则的详细解析。通过实例,读者可以掌握正则表达式的贪婪与非贪婪模式,以及如何应用正则表达式于常见场景如用户名、密码、URL验证。
3598

被折叠的 条评论
为什么被折叠?



