Python正则表达式是否有匹配字符串的最大长度限制?

我有个需求,匹配 HTML 里的注释。以下两段代码:

#!/usr/bin/env python3

import re

html = “”" <html> <something> </something> <!– aaa bbb ccc –> 111<!– ccc bbb aaa –>11 </html> “”"

item = re.findall(r"(?<=<!–).+?(?=–>)",html,re.S) for i in item: print(i)

上面这个可以匹配成功。

这个就匹配不出来:

#!/usr/bin/env python3

import requests import re import json import sys

s = requests.session()

params = { “ie” : “utf-8”, “kw” : “linux” } page = s.get(“http://tieba.baidu.com/f”,params = params) text = page.text

tiezi_data = re.findall(r"(?<=<!–).+?(?=–>)",text,re.S) print(tiezi_data) print(len(tiezi_data))

贴吧的页面里有大量注释,注释里有大量的信息,可以在浏览器里看到。但是我的正则只能匹配到第一个,我不知道为什么。


Python正则表达式是否有匹配字符串的最大长度限制?

6 回复

在 text 字符串中搜索下 <!-- , 只有 <!–STATUS OK–>, 好像服务器直接返回给你的内容中并没有什么注释,
页面中之所以能看到,应该是前端异步获取的内容,你再仔细确认下吧


Python正则表达式本身没有硬性的最大长度限制,但实际匹配能力受限于内存和正则引擎的实现。在Python的re模块中,你可以匹配非常长的字符串(比如几MB甚至更大),但性能会随着字符串长度和模式复杂度下降。

主要限制来自两个方面:

  1. 可用内存:超长字符串和复杂匹配可能消耗大量内存,导致MemoryError
  2. 回溯限制:复杂正则表达式可能导致指数级回溯,触发re模块的防御机制(回溯限制默认约1亿次),抛出RecursionError或超时。

示例代码:

import re

# 匹配长字符串示例
long_text = "a" * 1000000 + "target" + "b" * 1000000
pattern = r"target"
match = re.search(pattern, long_text)
print(f"匹配成功: {match.group() if match else '无匹配'}")

# 测试回溯问题(谨慎运行)
# pattern = r"(a+)+b"  # 危险模式,可能引发灾难性回溯
# text = "a" * 1000 + "b"
# match = re.search(pattern, text)  # 可能极慢或触发回溯限制

简单建议:处理超长文本时考虑分块或使用字符串方法替代正则。

我刚刚才看到,现在已经关电脑了,明天再看看。

贴吧那部分内容是 script 渲染上去的,直接 html 是没有内容的,而且即使有长度限制,也是直接报错的

Python<br>html = """<br>&lt;html&gt;<br> &lt;something&gt;<br> &lt;/something&gt;<br> &lt;!--<br> aaa<br> bbb<br> ccc<br> --&gt;<br> 111&lt;!--<br> ccc<br> bbb<br> aaa<br> --&gt;11<br>&lt;/html&gt;<br>"""<br>import re<br>re.findall(r"(?is)(?:\&lt;\!\-\-)(.+?)(?:\-\-\&gt;)",html)<br>['\n aaa\n bbb\n ccc\n ', '\n ccc\n bbb\n aaa\n ']<br><br>

除了异步加载的问题,另外匹配注释可以用 bs4 。 http://stackoverflow.com/questions/33138937/how-to-find-all-comments-with-beautiful-soup

回到顶部