正则表达式和它的Python接口

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接口

\color{red}{如果你没importre,别怪我这里没特意换一个颜色写!}

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,希望能和大家一起学习.
最后,都看到这了,赞赏一下呗!(^ ~ ^||).

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 4,218评论 0 13
  • 搞懂Python 正则表达式用法 Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一...
    厦热阅读 1,815评论 0 2
  • 一、正则表达式正则表达式(regular expression)是由一些特定字符以及组合所组成的字符串表达式,用来...
    IIronMan阅读 1,997评论 0 24
  • 今天是世界对称日。20200202。千年等一回。 若是闺女在,一定又会笑着跟我分享这个秘密了吧。即使不能外出,闺女...
    听花开的声音阅读 56评论 0 0
  • 大约7年前,好似囫囵吞枣粗略的读过这本书。 7年后,闲暇之余的消遣,让我几日不能平静。 记忆中争鸣的蓝色风筝,散落...
    一个没人知道的名字阅读 222评论 0 2

友情链接更多精彩内容