Python中的正则表达式是很不错的东西,可以很快的完成许多非常复杂的任务,比str对象用起来好很多,熟练掌握可以帮助我们快速完成任务.
1. 介绍
正则表达式是一种用于模式匹配的表达式.
2. 语法
| 语法 | 含义 | 备注 |
|---|---|---|
| [...] | 匹配方括号中的任意一个 | [abc]=a或b或c |
| [一个字符-另一个字符] | 表示字符编码中从一个字符到另一个字符中的任意一个 | 常用的有1-9,a-z,A-Z,可以连着用如[a-zA-z1-9] |
| [^...] | 匹配不在方括号中的任意字符 | [^abc]=除abc外的任意字符 |
| \s | 空白字符 | 空格,回车,换行,制表符等 |
| \S | 非空白字符 | |
| \w | 单词字符 | a-z,A-Z,0-9,汉字,下划线 |
| \W | 非单词字符 | |
| \d | 数字 | 只匹配一个,别想用\d匹配123 |
| \D | 非数字字符 | |
| . | 除了\n的任意字符 | 可以设置成匹配所有字符 |
| * | 匹配零个或多个字符 | |
| + | 匹配一个或多个字符 | |
| ? | 一次或零次 | 跟在不是*或+的字符后面 |
| ? | 非贪婪模式 | 跟在*或+后面,后面有详解 |
| ...{n} | ...匹配n次 | |
| ...{n,} | 最少n次 | |
| ...{,n} | 最多n次 | |
| ...{m,n} | m次到n次 | |
| () | 分组 | 后面有详解 |
| ^ | 开始 | ^x表示必须以x开始 |
| $ | 结尾 | x$表示必须以x结尾 |
3.贪婪与非贪婪
贪婪模式下,尽可能多的匹配
非贪婪模式下,尽可能少的匹配
eg:
匹配字符:<div>abc</div><div>def</div>
表达式:<div>.*</div>
".*"匹配到的部分:abc</div><div>def
表达式:<div>.*?
".*"匹配到的部分:abc
4.分组
(...):普通分组
(?:...):不是分组,()只是将他们分开
(?P<name>...)命名分组,将分组命名为name
一个比较有用的分组相关知识——回溯引用:
使用"\一个数字"进行回溯引用,表示引用之前第"那个数字"个分组匹配的内容.
比如说,有一个网页由于开发者的愚蠢,写出了下面的代码:
<h1>一个标题</h5>
那么如果我们简单的这样去匹配,
r"<h[1-6]>.*</h[1-6]>"
你会发现一个意料之中的令人惊讶的事实,竟然匹配到了!
那么这时候,我们可以这样:
r"<h([1-6])>.*</h\1>"
需要注意的是这里要确保\1没有被转义,可以写\1或前面设定不转义.
5.Python接口
re.compile(pattern:str,flag:int)
#pattern:正则表达式
#flags:特殊标志
#返回一个正则表达式对象,可用于多次使用的正则表达式以提高效率
#包含常用接口match,search,findall,sub等,这里只介绍re本身的,但正则表达式对象的和re本身的函数唯一的区别在于省去pattern参数
常用的特殊标记:
| 简写 | 全写 | 功能 |
|---|---|---|
| re.S | re.DOTALL | 让.可以匹配包括\n的任何字符 |
| re.I | re.IGNORECASE | 忽略大小写 |
| re.X | re.VERBOSE | 正则表达式可以为多行,且允许使用注释 |
| re.M | re.MULTILINE | 多行匹配,影响^和$的效果 |
除此之外有一些不太常用的re.L,re.U等等
re.match(pattern:str,string:str,flag:int)
#pattern:正则表达式
#string:用于匹配的字符串
#flags:标记,之前讲过
#从头匹配,返回一个match对象,match对象相关接口之后讲.
re.search(pattern:str,string:str,flags:str)
#pattern:正则表达式
#string:用于匹配的字符串
#flags:标记,之前讲过
#返回搜索到的第一个符合能匹配的部分,如果无法匹配返回None
这里要注意的一点是,正则表达式对象的search还有两个参数,startpos和endpos,正常情况下可以不传,表示开始位置和结束为止.
强大的sub
先看下定义:
re.sub(pattern,repl,string,count=0,flags=0)
pattern:正则表达式
repl:
两种情况:
如果他是一个字符串,很简单,把pattern匹配的部分替换成repl.如果他是一个函数,要接受一个参数matched,表示匹配对象,返回要替换的结果.
string:用于替换的原始字符串.
count:替换个数.
flags:标记
6.Match对象
matched.span()->tuple #返回一个元组,为匹配的(开始位置,结束位置)
matched.string()->str #返回匹配到的结果
matched.group(name)->str #返回某个组的匹配结果,name为空则返回整体匹配到的结果,name是str则返回命名组的结果,是数字则返回第几个组的结果.
matched.groups()->list #返回所有没有命名的组的匹配结果,matched.groups()[n]=matched.group(n)前提n是int
matched.groupdict()->dict #返回所有命名组的匹配结果,键是组名,值是租的匹配结果.
#这些是一般比较长用的了.
以上是这篇文章的全部,错误的地方恳请指正.
QQ:8955859,希望能和大家一起学习.
最后,都看到这了,赞赏一下呗!(^ ~ ^||).