自定义graphviz中有向图解析函数

graphviz中有向图解析函数

def match_slice(pattern, string, k=0)->list:
    '''
    返回首次或末次匹配到的字符串在原字符串的位置范围,若无返回空列表
    k=0表示默认从左到右查,当k = -1表示从右到左查,即查最后一个匹配的位置范围
    这里pattern,为re内的pattern
    彡
    220728
    '''
    # fullmatch函数,完全一样的字符串才可以匹配到。
    matchs_temp = re.finditer(pattern, string) # 返回一个匹配结果的迭代类型,每个迭代元素是match对象
    if k == 0:
        pass
        #print(k)
    else:
        k = -1
    try:
        match_span = [x for x in matchs_temp][k].span()
        rs = [match_span[0], match_span[1]]
    except:
        rs = []
    return rs

s_test = "1fghsfdhsfg}hsfghsf}};};  "
print(len(s_test))
print(match_slice("\};?",s_test,-1))
def digraph_resolver(dot_sourse)->list:
    '''
    解析器resolver
    parameter:
        dot_sourse:为dot.sourse    
    对列表dot.sourse中的每一字符所表示的内容进行判断归类,并返回结果列表
    类别有:
    # 图内外单行注释 [[], [], ...]
    # 图内外多行注释 [[], [], ...]
    # 图 [[图头],[图体],[图尾]]
    
    # 图属性 [[], [], ...]
    # 子图 [[], [], ...] >>> 点 ,边
    # 点 [[], [], ...] >>> 点的对应标签
    # 边 [[], [], ...]
    
    彡
    220723-220728
    '''
    pattern4comment1 = "//.*" # 获取图内外单行注释?? 可能还需要结合换行符来判断
    pattern4comment2 = "/\*.*?\*/" # 获取图内外多行注释?? 可能还需要结合换行符来判断
    pattern4bigraph = "digraph +[a-zA-Z\_][0-9a-zA-Z\_]* +\{.*\}" # 获取图的全部字符串
    pattern4bigraph_head = "digraph +[a-zA-Z\_][0-9a-zA-Z\_]* +\{" # 获取图头全部字符串
    pattern4bigraph_attr = "(graph|node|edge) +\[.*?\];?" # 获取图属性的字符串
    pattern4subgraph = "subgraph +cluster[0-9a-zA-Z\_]+ +\{.*?[^\\\\]\};?" # 获取子图的字符串
    # 子图的体内不要出项 } 否则会出错
    pattern4node = '(([0-9]+)|([a-zA-Z\_][0-9a-zA-Z\_]*[^(digraph|graph|node|edge)])|( ?"[^"]+?[^\\\\]")|( ?"")) +\[.*?[^\\\\]\];?'
    # 该模式对 """""" 无效!!!
    # 获取点的全部可能字符串 !=digraph|graph|node|edge;对点的描述必须带[]且至少有一个空格隔开!!!
    pattern4edge = '(([0-9]+)|([a-zA-Z\_][0-9a-zA-Z\_]*)|( ?"[^"]+?[^\\\\]")|( ?""))( *: *[a-zA-Z\_][0-9a-zA-Z\_]*)? *-> *(([0-9]+)|([a-zA-Z\_][0-9a-zA-Z\_]*)|( ?"[^"]+?[^\\\\]")|( ?""))( *: *[a-zA-Z\_][0-9a-zA-Z\_]*)? *(\[.*?[^\\\\]\])?;?'
    # 获取边的全部可能字符串;括号后跟?可以使得括号内的匹配成为可选匹配;以上pattern包含了port的情况!
    pattern4label = 'label *= *(".*?[^\\\\]"|\< *\< *table .*table *\> *\>)'
    # 获取点标签的全部可能字符串
    
    # 结果收集
    li_comment1s = []
    li_comment2s = []
    li_bigraph_temp = [] # 用于暂时存放图
    li_bigraph = [] # 用于存放[图头],[图体],[图尾]
    li_bigraph_attrs = []
    li_subgraphs = []
    li_nodes = []
    li_edges = []
    li_other = [] # 其他无法归类的字符串
    # 
    li_source = []
    with open("dot_source.txt",'w') as f:
        for line in dot_sourse:
            #f.writelines(line)
            f.write(line)
            li_source.append(line)
        
    #print("li_source:",li_source) # 包含换行符
    s_source = ''.join(li_source) # 包含换行符的完整字符串 !!!
    print("s_source:",s_source)
    lines = s_source.split("\n"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值