You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python中提取正则表达式匹配的所有目标内容?

解决Python正则贪婪匹配,提取所有独立<p>标签内容的方法

嘿,我懂你的问题——你的正则用了贪婪匹配模式,结果会从第一个&lt;p&gt;一直拽到最后一个&lt;/p&gt;,把整个长串都吞进去,根本没法逐个提取每个独立的标签块。别慌,有几个简单实用的办法能搞定这个需求:

方法1:用非贪婪量词(最常用)

正则里的.*是贪婪匹配,会尽可能多捞字符。咱们把它改成.*?(非贪婪量词),就能让正则碰到第一个&lt;/p&gt;就停手,从而逐个捕获每个<p>标签的内容。

完整代码示例

import re
string = "Any information &lt;p&gt;sent to the server as clear text&lt;/p&gt;, may be stolen and used later for &lt;p&gt;identity theft&lt;/p&gt; or user impersonation. In addition, several privacy regulations state that sensitive information such as user&lt;p&gt; credentials will always be sent encrypted &lt;/p&gt; to the web site."

# 匹配完整的<p>标签(包含标签本身)
regex_full_tag = r'&lt;p&gt;.*?&lt;/p&gt;'
full_matches = re.findall(regex_full_tag, string)

# 如果只想提取标签内的纯文本(去掉<p>和</p>),可以加捕获组
regex_text_only = r'&lt;p&gt;(.*?)&lt;/p&gt;'
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实体(比如&amp;),用.*?偶尔会出小问题,这时候可以用更精确的正则,确保不会误把其他实体当成&lt;/p&gt;

regex_strict = r'&lt;p&gt;[^&]*(?:&(?!/p&gt;)[^&]*)*&lt;/p&gt;'
strict_matches = re.findall(regex_strict, string)

这个正则的逻辑是:匹配&lt;p&gt;后,先抓非&的字符,碰到&就检查是不是&lt;/p&gt;的开头,不是的话就继续匹配,直到碰到真正的&lt;/p&gt;为止。

为啥原来的正则不行?

你之前写的&lt;p&gt;.*&lt;/p&gt;用了贪婪的.*,它会从第一个&lt;p&gt;开始,一直匹配到字符串里最后一个&lt;/p&gt;,所以只会得到一个超长的匹配结果,而不是多个独立的标签内容。

内容的提问来源于stack exchange,提问作者Navneet

火山引擎 最新活动