Python正则表达式提取HTML表格内容:匹配非<>字符问题
从HTML标签提取文本的正则匹配问题
问题背景
想用Python从HTML的table标签里提取纯文本,计划通过递归调用re.sub移除所有<...>格式的标签,最终得到目标文本。但写正则时搞不定匹配标签内容的逻辑,测试代码没生效,期望先得到Hello</td>,再递归处理得到Hello。测试代码如下:
import re test_str = '<td style="color:blue">Hello</td>' test_str = re.sub('<{1}^[<>].*>{1}','',test_str) print(test_str)
问题分析
你写的正则<{1}^[<>].*>{1}完全逻辑错误:
<{1}等价于<,>{1}等价于>,没必要多此一举^[<>]里的^放在字符集外是表示行开头,不是取反,完全不符合你想匹配标签内部内容的需求- 整个正则根本匹配不了任何有效标签
解决方法
要匹配<...>格式的标签,用非贪婪匹配的正则<.*?>就可以,它会匹配从<开始到最近的>结束的内容,正好符合你分步替换的需求。再结合递归处理直到没有标签为止,代码如下:
import re def strip_html_tags(text): # 替换所有<...>标签为空字符串 processed_text = re.sub(r'<.*?>', '', text) # 如果还有残留标签,递归处理 if '<' in processed_text: return strip_html_tags(processed_text) return processed_text # 测试 test_str = '<td style="color:blue">Hello</td>' print(strip_html_tags(test_str)) # 输出: Hello
补充说明
- 正则里的
r''是原始字符串,避免转义字符干扰 .*?是非贪婪匹配模式,能保证每次只匹配单个标签,不会把多个嵌套标签(比如<a>xxx</a>)当成一个整体匹配掉- 递归终止条件是字符串里没有
<,说明所有标签都已被移除
内容的提问来源于stack exchange,提问作者Seeingstars
相关产品推荐
相关产品推荐

