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正则表达式是否有匹配字符串的最大长度限制?
在 text 字符串中搜索下 <!-- , 只有 <!–STATUS OK–>, 好像服务器直接返回给你的内容中并没有什么注释,
页面中之所以能看到,应该是前端异步获取的内容,你再仔细确认下吧
Python正则表达式本身没有硬性的最大长度限制,但实际匹配能力受限于内存和正则引擎的实现。在Python的re模块中,你可以匹配非常长的字符串(比如几MB甚至更大),但性能会随着字符串长度和模式复杂度下降。
主要限制来自两个方面:
- 可用内存:超长字符串和复杂匹配可能消耗大量内存,导致
MemoryError。 - 回溯限制:复杂正则表达式可能导致指数级回溯,触发
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) # 可能极慢或触发回溯限制
简单建议:处理超长文本时考虑分块或使用字符串方法替代正则。
我刚刚才看到,现在已经关电脑了,明天再看看。
Python<br>html = """<br><html><br> <something><br> </something><br> <!--<br> aaa<br> bbb<br> ccc<br> --><br> 111<!--<br> ccc<br> bbb<br> aaa<br> -->11<br></html><br>"""<br>import re<br>re.findall(r"(?is)(?:\<\!\-\-)(.+?)(?:\-\-\>)",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


