Python正则表达式\W+和\W*匹配过程的深入分析
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python正则表达式\W+和\W*匹配过程的深入分析,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2543字,纯文字阅读大概需要4分钟。
内容图文
![Python正则表达式\W+和\W*匹配过程的深入分析](/upload/InfoBanner/zyjiaocheng/735/0671805bc76f4ab4b8752ade7ebce61d.jpg)
在学习re.split函数的处理过程中,发现执行如下语句及返回与老猿预想的不一致:
>>> re.split('\W*','Hello,world')
['', 'H', 'e', 'l', 'l', 'o', '', 'w', 'o', 'r', 'l', 'd', '']
而老猿期望的是[’’, ‘Hello’, ‘’, ‘world’, ‘’],结果差异很大。
我们再看使用组模式匹配的结果:
>>> re.split('(\W*)','Hello,world')
['', '', 'H', '', 'e', '', 'l', '', 'l', '', 'o', ',', '', '', 'w', '', 'o', '', 'r', '', 'l', '', 'd', '', '']
也不是老猿期望的:[’’,‘Hello’, ‘,’, ‘world’, ‘’]。
将上述匹配模式中的\W*改成\W+,来看看效果:
>>> re.split('\W+','Hello,world')
['Hello', 'world']
>>> re.split('(\W+)','Hello,world')
['Hello', ',', 'world']
>>>
这个效果与老猿预想一致。在老猿预想的里面,使用“\W*”和“\W+”的区别应该就是在搜索文本头和尾的处理上二者有区别,“\W*”应该比“\W+”只多头和尾匹配的空字符串,毕竟二者都是贪婪模式,只是“\W*允许0次重复”。为什么执行结果却大相径庭呢?
经过仔细思考,老猿认为正则的匹配过程有关,在贪婪模式下,老猿理解上述正则表达式的匹配基本处理方法如下:
- 所有匹配过程都是从搜索文本当前匹配到的位置(为了后续方便称为当前匹配位置)开始的,首次匹配就从搜索文本位置0开始,其后真正匹配过程每匹配一个字符匹配位置加一(前视断言、后视断言等不消耗搜索文本的方法除外);
- 每次匹配时,都是从搜索文本当前匹配位置开始以类似切片的机制开始匹配:
1)切片的开始位置为当前位置,切片的结束位置从当前位置开始逐一增加(假设当前位置为n,则第一次切片类似n:n,也就是空字符串);
2)每次切片都会验证是否切片后的内容能否匹配当前模式,如果能匹配,切片结束位置加一,按此顺序处理,直到切片不能匹配为止;
3)如果当前切片不能匹配,则匹配的搜索文本子串就是前一个切片(不妨称为匹配切片),如果前一个切片的起止位置相同则为空字符串,如果起始位置大于结束位置则没有匹配到,否则就是正常匹配;
4)匹配到空串或正常子串都认为匹配成功,当前匹配位置=匹配切片结束位置+1。
这样我们回头来看使用“\W*”和“\W+”来匹配单词“Hello”的过程,由于每个字符当前位置的0长切片都为空字符串,他们满足“\W*”匹配要求,而下个长度为1的切片是字母字符,不能满足匹配的要求,因此会认为单词的每个字母之间都会被空字符串分割,如果不接受这样的结果,使用”\W+”来匹配就可以。
关于阅读本文所需要使用的基础知识请参考:
1、关于“\W*”和“\W+”的含义请参考《第11.15节 Python正则表达式转义符定义的特殊序列》;
2、关于切片请参考《第3章 Python的数据类型 第3.1节 功能强大的 Python序列概述》;
3、关于正则表达式贪婪模式请参考:《第11.9节 Python正则表达式的贪婪模式和非贪婪模式》及《转:正则表达式之 贪婪与非贪婪模式详解》;
4、关于re.split请参考《第11.22节Python 中re模块的split函数》。
老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!
内容总结
以上是互联网集市为您收集整理的Python正则表达式\W+和\W*匹配过程的深入分析全部内容,希望文章能够帮你解决Python正则表达式\W+和\W*匹配过程的深入分析所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。