Python常用正则表达式方法

正则总结

a、正则常用的方法:
方法含义
match()判断一个正则表达式是否从开始处匹配一个字符串
search()遍历字符串,找到正则表达式匹配的第一个位置
findall()遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回
finditer()遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回
sub()sub(‘正则’,‘替换项’,待匹配) 就是将匹配到的部分,用替换项替换
compilecompile(正则表达式) 将通用正则表达式转成一个正则对象,下面只需要使用这个就好。
比如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}mn均为非负整数,其中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]*?


  1. a-z0-9_- ↩︎

  2. a-z0-9_- ↩︎

  3. \u2E80-\u9FFF ↩︎

  4. \s\S ↩︎

  5. 0-9 ↩︎

  6. 习题 ↩︎

  7. \s\S ↩︎

  8. 0-9 ↩︎

  9. \s\S ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值