MST

星途 面试题库

面试题:Python基于特定位置正则匹配处理嵌套结构字符串

假设给定一个类似HTML标签结构的字符串 '<div class="content"><p>First paragraph</p><p>Second paragraph</p></div>',从第10个字符位置开始,使用正则表达式匹配出所有<p>标签内的文本内容,并处理可能存在的嵌套标签情况,例如 '<p>Some text <b>bold</b> more text</p>',用Python代码实现,详细说明实现过程中处理嵌套结构的逻辑和方法。
21.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import re


def find_p_text(html_str):
    # 处理嵌套标签的正则表达式逻辑:
    # 1. 对于非嵌套标签,直接匹配<p>标签内的文本
    # 2. 对于嵌套标签,这里通过一个平衡括号的方法来处理
    # 用一个变量来记录当前匹配到的左括号和右括号数量,当数量平衡时,表示一个完整的<p>标签内容匹配结束
    pattern = re.compile(r'<p>(.*?)</p>', re.DOTALL)
    start_index = 10
    result = []
    sub_str = html_str[start_index:]
    matches = pattern.finditer(sub_str)
    for match in matches:
        text = match.group(1)
        result.append(text)
    return result


html = '<div class="content"><p>First paragraph</p><p>Second paragraph</p></div>'
print(find_p_text(html))
  1. 导入模块:首先导入re模块,用于正则表达式操作。
  2. 定义函数find_p_text函数接受一个HTML字符串作为参数。
  3. 正则表达式定义
    • 使用re.compile定义一个正则表达式模式r'<p>(.*?)</p>',其中(.*?)是一个非贪婪匹配组,用于匹配<p></p>标签之间的内容。re.DOTALL标志使得.可以匹配包括换行符在内的所有字符,以处理可能跨多行的内容。
  4. 确定起始位置和初始化变量
    • start_index设置为10,表示从第10个字符位置开始匹配。
    • result列表用于存储匹配到的<p>标签内的文本内容。
    • sub_str是从start_index开始的子字符串,后续的匹配操作在这个子字符串上进行。
  5. 查找匹配项
    • 使用pattern.finditer(sub_str)查找所有匹配项,该方法返回一个迭代器,包含所有匹配的结果。
  6. 提取文本并处理嵌套结构
    • 在循环中,通过match.group(1)获取<p></p>标签之间的文本内容,并添加到result列表中。
    • 对于嵌套标签,正则表达式中的非贪婪匹配(.*?)会尽可能少地匹配字符,直到遇到对应的</p>标签,从而正确处理嵌套标签情况,如<p>Some text <b>bold</b> more text</p>
  7. 返回结果:最后返回result列表,其中包含从指定位置开始匹配到的所有<p>标签内的文本内容。