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