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
原创粉丝点击