python实现的一个简单的文本解析工具,用于解析类xml格式(不带标签属性、标签不嵌套)
来源:互联网 发布:剑三大师脸型数据 编辑:程序博客网 时间:2024/06/05 16:54
比较赶时间,但是终于完成了,但实在菜鸟,因此搞了两天才搞好(昨晚两点才睡),也许我并不适合做程序员,逻辑思维太差了。
闲言少叙,开始正题:
要解析的文本格式:
!<AAA>message in levels!</AAA>目的:只需要识别出标签(称为tag)和标签之间的内容(姑且称之为section)即可。
实现方法:用正则匹配不同的tag,以及不同tag之间的section。
需要注意的地方:
1、标签可能不闭合;
2、第一个标签之前的内容(如果有)和最后一个标签之后(如果有)的内容需要注意处理
3、不同tag之间的section如何截取
代码:
#conding:utf-8import repath=r"D:\Python27\python_project\starttun\source.txt"newpath=r"D:\Python27\python_project\starttun\source---new.txt"class tagnodeModel: def __init__(self,name=None,type=None): self.name=name self.type=type def getTagandSection(fhandle): tagnodes=[] section=[] element={} fcontent=fhandle.read() for tag in re.findall(r"!<[\w-]+>|!</[\w-]+>",fcontent,re.S): tagnode=tagnodeModel(name=None,type=None) nameS=''.join(re.findall(r"!<([\w-]+)>",tag)) nameE=''.join(re.findall(r"!<(/[\w-]+)>",tag)) if nameS: tagnode.name=nameS tagnode.type="S" #StartTag elif nameE: tagnode.name=nameE tagnode.type="E" #EndTag tagnodes.append(tagnode) #find out unclose tag: for id in range(len(tagnodes)): if id==0: section="".join(re.findall(r"(.*)(?:!<%s>)" \ %tagnodes[id].name,fcontent,re.S)) element["000UnkownTag"]=section preNode= tagnodes[id-1] curNode= tagnodes[id] preNodeName=preNode.name preNodetype=preNode.type curNodeName=curNode.name curNodetype=curNode.type tagcouple=(preNodeName,curNodeName) section=''.join(re.findall(r"!<%s>\n(.*)!<%s>" \ % tagcouple,fcontent,re.S)).strip("\n") if same(preNodeName,curNodeName): element[cleanStr(curNodeName)]=section else: if curNodetype=="E" and preNodetype=="E" : element[cleanStr(curNodeName)]=section elif curNodetype=="S" and preNodetype=="S" : element[cleanStr(preNodeName)]=section elif curNodetype=="S" and preNodetype=="E" : pass elif curNodetype=="E" and preNodetype=="S" : raise Exception("FormatError: Section between", \ preNodetype,"and",curNodetype,"cannot be parsed...") if curNodetype=="S" and id==len(tagnodes)-1: section="".join(re.findall(r"(?<=!<%s>\n)(.*)" \ %tagnodes[id].name,fcontent,re.S)) element[cleanStr(curNodeName)]=section return elementdef same(preNodeName=None,curNodeName=None): #print preNodeName,curNodeName if (preNodeName in curNodeName) or (curNodeName in preNodeName): return Truedef cleanStr(tagname): return ''.join(re.findall("[\w-]+",tagname)) with open(newpath,'w') as newfhandle: with open(path,'r') as fhandle: elements=getTagandSection(fhandle) for tag in elements: print >> newfhandle,"!<%s>"%tag print >> newfhandle,elements[tag] if elements[tag]!="000UnkownTag": print >> newfhandle,"!</%s>"%tag # print "!<%s>"%tag # print elements[tag] # print "!<%s>"%tag
0 0
- python实现的一个简单的文本解析工具,用于解析类xml格式(不带标签属性、标签不嵌套)
- XML解析之----SAX解析(带属性与不带属性)----自定义Handler类
- JSP自定义不带属性和标签体的简单标签
- 标签不解析
- 简单标签与带属性的标签
- 利用dom4j解析.xml之查询标签的文本信息
- 一个用于解析xml文档的类
- javascript/jquery解析XML带namespace的标签
- XML的标签属性、带参XML
- 一个python写的XML解析器的简单实现
- mui html标签不解析
- jstl fmt:formatDate标签不解析的解决办法
- IE11中<dd>标签不显示 的原因解析
- echo输出的内容不解析html标签怎么办
- 常用jstl标签,不解析jstl的解决办法
- echo输出的内容不解析html标签
- dom4j 解析 xml标签属性
- struts.xml配置文件的各个 标签/属性 解析(转)
- OCP-1Z0-051 第169题 使用子查询DELETE数据
- OCP 1Z0 051 117
- Bellman-Ford算法的改进:SPFA算法
- 关于父类没有缺省的构造函数时,子类如何建立构造函数
- cocos2dx中的box2d
- python实现的一个简单的文本解析工具,用于解析类xml格式(不带标签属性、标签不嵌套)
- 黑马程序员_java的反射与内省
- 软件架构与数据结构
- 浏览器也郁闷了,来吐个槽
- xcode 5.1.1 storyBoard 在二级页面写按钮不崩溃的方法
- ZOJ 3468 Dice War
- yongtGaCd探汲偌史资牧敢
- Where are my gravitybox audio recordings stored?
- 软件架构师的能力与特质