python正则中最短匹配实现代码


Posted in Python onJanuary 16, 2018

下面从一个例子入手:

利用正则表达式解析下面的XML/HTML标签:

<composer>Wolfgang Amadeus Mozart</composer>
<author>Samuel Beckett</author> 
<city>London</city>

希望自动格式化重写为:

composer: Wolfgang Amadeus Mozart
author: Samuel Beckett
city: London

一个代码是这样的形式:

#coding:utf-8 
import re 
s="""<composer>WolfgangAmadeus Mozart</composer> 
   <author>SamuelBeckett</author> 
   <city>London</city>""" 
pattern1=re.compile("<\w+>")  #匹配<>中任意的字符 
pattern2=re.compile(">.+</")  #匹配><中任意的字符 
listNames=pattern1.findall(s) #获取所有满足正则表达式pattern1的字符串的列表 
listContents=pattern2.findall(s) #获取所有满足正则表达式pattern2的字符串的列表 
#由于xml是规范的,所以是一一对应(对于错误输入,暂时不考虑) 
for i in range(len(listNames)): 
  #输出的时候利用切片丢弃多余的符号,如:<>/ 
  print(listNames[i][1:len(listNames[i])-1],":", 
     listContents[i][1:len(listContents[i])-2])

这个代码运行后结果是可以的。

下面我们修改下s的格式:

#coding:utf-8
import re

s="<composer>Wolfgang Amadeus Mozart</composer> <author>Samuel Beckett</author> <city>London</city>"
pattern1=re.compile("<\w+>")  #匹配<>中任意的字符
# 此模式为非贪婪模式,所以s不是多行也可以匹配
pattern2=re.compile(">.+</")  #匹配><中任意的字符,问号必须加,"?"是非贪婪匹配
listNames=pattern1.findall(s) #获取所有满足正则表达式pattern1的字符串的列表
listContents=pattern2.findall(s) #获取所有满足正则表达式pattern2的字符串的列表

#由于xml是规范的,所以是一一对应(对于错误输入,暂时不考虑)
for i in range(len(listNames)):
  #输出的时候利用切片丢弃多余的符号,如:<>/
  print(listNames[i][1:len(listNames[i])-1],":",
     listContents[i][1:len(listContents[i])-2])

得到的答案如下所示:

python正则中最短匹配实现代码

我们打印一下匹配到的两个结果看一下,修改代码如下:

#coding:utf-8
import re

s="<composer>Wolfgang Amadeus Mozart</composer> <author>Samuel Beckett</author> <city>London</city>"
pattern1=re.compile("<\w+>")  #匹配<>中任意的字符
# 此模式为非贪婪模式,所以s不是多行也可以匹配
pattern2=re.compile(">.+</")  #匹配><中任意的字符,问号必须加,"?"是非贪婪匹配
listNames=pattern1.findall(s) #获取所有满足正则表达式pattern1的字符串的列表
listContents=pattern2.findall(s) #获取所有满足正则表达式pattern2的字符串的列表

print(listNames)
print(listContents)

#由于xml是规范的,所以是一一对应(对于错误输入,暂时不考虑)
for i in range(len(listNames)):
  #输出的时候利用切片丢弃多余的符号,如:<>/
  print(listNames[i][1:len(listNames[i])-1],":",
     listContents[i][1:len(listContents[i])-2])

显示结果如下:

python正则中最短匹配实现代码

从第一个箭头显示可以看出,这个处理是对的,那么看第二个箭头,这个匹配的结果显然是不对的了,那么是什么原因呢?
这是因为在正则中,‘*'、‘+'、‘?'这些是贪婪匹配,如用 a*,操作结果是尽可能多地匹配模式。所以当你试着匹配一对对称的定界符,如 HTML 标志中的尖括号。匹配单个 HTML 标志的模式不能正常工作,因为 .* 的本质是“贪婪”的 。在这种情况下,解决方案是使用不贪婪的限定符 *?、+?、?? 或 {m,n}?,尽可能匹配小的文本。

那么代码可以修改如下:

#coding:utf-8
import re

s="<composer>Wolfgang Amadeus Mozart</composer> <author>Samuel Beckett</author> <city>London</city>"
pattern1=re.compile("<\w+?>")  #匹配<>中任意的字符
# 此模式为非贪婪模式,所以s不是多行也可以匹配
pattern2=re.compile(">.+?</")  #匹配><中任意的字符,问号必须加,"?"是非贪婪匹配
listNames=pattern1.findall(s) #获取所有满足正则表达式pattern1的字符串的列表
listContents=pattern2.findall(s) #获取所有满足正则表达式pattern2的字符串的列表

#由于xml是规范的,所以是一一对应(对于错误输入,暂时不考虑)
for i in range(len(listNames)):
  #输出的时候利用切片丢弃多余的符号,如:<>/
  print(listNames[i][1:len(listNames[i])-1],":",
     listContents[i][1:len(listContents[i])-2])

最后,用分组对代码的正则进行优化一下,如下:

#coding:utf-8
import re

s="<composer>Wolfgang Amadeus Mozart</composer><author>Samuel Beckett</author><city>London</city>"
pattern1=re.compile("<(\w+?)>")  #匹配<>中任意的字符
# 此模式为非贪婪模式,所以s不是多行也可以匹配
pattern2=re.compile("<\w+?>(.+?)</\w+?>")  #匹配<a>...</a>中任意的字符,问号必须加,"?"是非贪婪匹配
listNames=pattern1.findall(s) #获取所有满足正则表达式pattern1的字符串的列表
listContents=pattern2.findall(s) #获取所有满足正则表达式pattern2的字符串的列表

#由于xml是规范的,所以是一一对应(对于错误输入,暂时不考虑)
for i in range(len(listNames)):
  print(listNames[i],":",
     listContents[i])

这篇文章就介绍到这,大家可以多参考三水点靠木以前发布的关于python 正则表达式的相关内容。

Python 相关文章推荐
python调用新浪微博API项目实践
Jul 28 Python
Python之PyUnit单元测试实例
Oct 11 Python
Python学习笔记整理3之输入输出、python eval函数
Dec 14 Python
微信 用脚本查看是否被微信好友删除
Oct 28 Python
Python安装官方whl包和tar.gz包的方法(推荐)
Jun 04 Python
Python读取txt内容写入xls格式excel中的方法
Oct 11 Python
便捷提取python导入包的属性方法
Oct 15 Python
python实现flappy bird小游戏
Dec 24 Python
python 返回一个列表中第二大的数方法
Jul 09 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 Python
python能否java成为主流语言吗
Jun 22 Python
Python程序员面试题 你必须提前准备!
Jan 16 #Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
Jan 16 #Python
Python+tkinter模拟“记住我”自动登录实例代码
Jan 16 #Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 #Python
Python爬虫爬取一个网页上的图片地址实例代码
Jan 16 #Python
Python+Turtle动态绘制一棵树实例分享
Jan 16 #Python
Python实现七彩蟒蛇绘制实例代码
Jan 16 #Python
You might like
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
jquery创建div 实现代码
2009/04/27 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
JS中判断null、undefined与NaN的方法
2014/03/24 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
2014/10/16 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
2016/11/24 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
[00:15]TI9地铁玩家打卡
2019/08/11 DOTA
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
Python模拟用户登录验证
2017/09/11 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
Django中的静态文件管理过程解析
2019/08/01 Python
解决Python对齐文本字符串问题
2019/08/28 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
python time()的实例用法
2020/11/03 Python
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
面向中国市场的在线海淘美妆零售网站:Beauty House美丽屋
2021/03/02 全球购物
如何查看在weblogic中已经发布的EJB
2012/06/01 面试题
大专生自我鉴定范文
2013/10/01 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
举起手来观后感
2015/06/09 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书