MST

星途 面试题库

面试题:Python findall和finditer在处理嵌套结构文本查找位置的优化

假设有一段嵌套结构的XML文本如下:<root><element>content1</element><element>content2<sub - element>subcontent1</sub - element></element><element>content3</element></root>,使用Python的re模块(可结合其他必要模块),通过findall和finditer方法,找出所有 <element> 标签及其内部内容在文本中的起始和结束位置,同时要考虑到嵌套情况,确保结果准确。要求代码具备高效性和健壮性,写出完整代码及必要注释。
37.7万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import re


def find_element_positions(xml_text):
    # 用于匹配开始标签
    start_tag_pattern = re.compile(r'<element>')
    # 用于匹配结束标签
    end_tag_pattern = re.compile(r'</element>')
    positions = []
    start_stack = []
    start_index = 0
    # 查找所有开始标签的位置
    for start_match in start_tag_pattern.finditer(xml_text):
        start_stack.append(start_match.start())
    # 查找所有结束标签的位置
    for end_match in end_tag_pattern.finditer(xml_text):
        if start_stack:
            start = start_stack.pop()
            positions.append((start, end_match.end()))
    return positions


xml_text = '<root><element>content1</element><element>content2<sub - element>subcontent1</sub - element></element><element>content3</element></root>'
result = find_element_positions(xml_text)
for pos in result:
    print(f"起始位置: {pos[0]}, 结束位置: {pos[1]}")
  1. 首先定义了两个正则表达式start_tag_patternend_tag_pattern,分别用于匹配<element>开始标签和</element>结束标签。
  2. 使用start_stack栈来存储开始标签的位置。
  3. 通过finditer方法查找所有开始标签和结束标签的位置。
  4. 每当找到一个结束标签时,从栈中弹出一个开始标签的位置,组成一个元组表示<element>标签及其内部内容的起始和结束位置,并添加到positions列表中。
  5. 最后返回所有<element>标签及其内部内容的位置列表,并进行打印展示。