如何用Python拆分特定格式字符串并实现层级化格式化输出?
层级节点解析与格式化解决方案
核心思路
- 先通过正则匹配拆分原始字符串,分离出所有节点标记(以
$$开头、包含<block=begin>/<block=end>的片段)和中间文本内容,得到混合列表。 - 用栈结构处理嵌套逻辑:遇到
begin标记时入栈并提升缩进层级,遇到end标记时出栈并降低缩进层级。 - 根据当前层级对每个元素添加对应缩进,最终拼接成层级化的输出字符串。
代码实现(Python)
import re def parse_nested_nodes(input_str): # 正则匹配所有节点标记,拆分字符串为标记和文本的混合列表 pattern = re.compile(r'(\$\$[A-Za-z0-9_]+<block=(begin|end)>)') raw_parts = pattern.split(input_str) # 过滤空内容并去除首尾空格 cleaned_parts = [p.strip() for p in raw_parts if p.strip()] stack = [] indent_level = 0 indent_unit = " " # 用3个空格作为缩进单位 result_lines = [] for part in cleaned_parts: if "<block=begin>" in part: # 处理开始节点:先添加当前层级的标记,再入栈提升层级 result_lines.append(indent_unit * indent_level + part) stack.append(part) indent_level += 1 elif "<block=end>" in part: # 处理结束节点:先降低层级,再添加对应缩进的标记 indent_level -= 1 result_lines.append(indent_unit * indent_level + part) else: # 处理文本内容:添加当前层级的缩进 result_lines.append(indent_unit * indent_level + part) return "\n".join(result_lines) # 测试用例 test_case1 = "$$Node_Type<block=begin>Blabla$$Node_Type<block=end>" test_case2 = "$$Node_Type1<block=begin>Blabla1$$Node_Type2<block=begin>Blabla2$$Node_Type2<block=end>$$Node_Type1<block=end>" print("测试用例1输出:") print(parse_nested_nodes(test_case1)) print("\n测试用例2输出:") print(parse_nested_nodes(test_case2))
关键逻辑说明
- 正则拆分:通过正则表达式精准匹配节点标记,确保将原始字符串拆分为
[标记, 文本, 标记, ...]的结构,为后续处理打下基础。 - 栈维护层级:栈的入栈/出栈操作严格对应嵌套结构的开启/闭合,保证缩进层级的准确性,避免嵌套错乱。
- 缩进格式化:用固定的缩进单位(如3个空格)对不同层级的内容进行对齐,最终输出符合要求的层级化文本。
实际输出效果
测试用例1输出:
$$Node_Type<block=begin> Blabla $$Node_Type<block=end>
测试用例2输出:
$$Node_Type1<block=begin> Blabla1 $$Node_Type2<block=begin> Blabla2 $$Node_Type2<block=end> $$Node_Type1<block=end>
内容的提问来源于stack exchange,提问作者SanjiSqurt
相关产品推荐
相关产品推荐

