如何在Python中提取正则表达式匹配的所有目标内容?
解决Python正则贪婪匹配,提取所有独立<p>标签内容的方法
嘿,我懂你的问题——你的正则用了贪婪匹配模式,结果会从第一个<p>一直拽到最后一个</p>,把整个长串都吞进去,根本没法逐个提取每个独立的标签块。别慌,有几个简单实用的办法能搞定这个需求:
方法1:用非贪婪量词(最常用)
正则里的.*是贪婪匹配,会尽可能多捞字符。咱们把它改成.*?(非贪婪量词),就能让正则碰到第一个</p>就停手,从而逐个捕获每个<p>标签的内容。
完整代码示例
import re string = "Any information <p>sent to the server as clear text</p>, may be stolen and used later for <p>identity theft</p> or user impersonation. In addition, several privacy regulations state that sensitive information such as user<p> credentials will always be sent encrypted </p> to the web site." # 匹配完整的<p>标签(包含标签本身) regex_full_tag = r'<p>.*?</p>' full_matches = re.findall(regex_full_tag, string) # 如果只想提取标签内的纯文本(去掉<p>和</p>),可以加捕获组 regex_text_only = r'<p>(.*?)</p>' text_matches = re.findall(regex_text_only, string) # 输出结果 print("完整的标签匹配结果:") for match in full_matches: print(match) print("\n提取的标签内纯文本:") for text in text_matches: print(text.strip()) # strip()用来清理文本前后的多余空格
方法2:更严谨的匹配(适配复杂场景)
如果你的<p>标签里可能混着其他&开头的HTML实体(比如&),用.*?偶尔会出小问题,这时候可以用更精确的正则,确保不会误把其他实体当成</p>:
regex_strict = r'<p>[^&]*(?:&(?!/p>)[^&]*)*</p>' strict_matches = re.findall(regex_strict, string)
这个正则的逻辑是:匹配<p>后,先抓非&的字符,碰到&就检查是不是</p>的开头,不是的话就继续匹配,直到碰到真正的</p>为止。
为啥原来的正则不行?
你之前写的<p>.*</p>用了贪婪的.*,它会从第一个<p>开始,一直匹配到字符串里最后一个</p>,所以只会得到一个超长的匹配结果,而不是多个独立的标签内容。
内容的提问来源于stack exchange,提问作者Navneet




