Python中如何使用正则表达式的懒惰匹配来匹配多个内容?

str = 'asd(hello)asd(world)'
s = re.search(r'(?<=\().*?(?=\))',str1)
print(s)
<re.Match object; span=(4, 9), match='hello'>

只能匹配出第一个 hello,如何匹配出所有()里的内容呢


Python中如何使用正则表达式的懒惰匹配来匹配多个内容?
7 回复

\w+((.*?)){1,}


import re

# 原始文本
text = "start item1 middle item2 middle item3 end"

# 贪婪匹配(默认) - 会匹配尽可能长的内容
greedy_pattern = r"start.*middle.*end"
greedy_match = re.search(greedy_pattern, text)
print("贪婪匹配结果:", greedy_match.group() if greedy_match else "无匹配")

# 懒惰匹配(非贪婪) - 使用?让量词尽可能少匹配
lazy_pattern = r"start.*?middle.*?end"
lazy_match = re.search(lazy_pattern, text)
print("懒惰匹配结果:", lazy_match.group() if lazy_match else "无匹配")

# 更实际的例子:提取所有<div>标签内容
html = "<div>内容1</div><div>内容2</div><div>内容3</div>"

# 错误方式:贪婪匹配会匹配整个字符串
greedy_div = re.findall(r"<div>.*</div>", html)
print("贪婪匹配div:", greedy_div)

# 正确方式:懒惰匹配每个<div>标签
lazy_div = re.findall(r"<div>.*?</div>", html)
print("懒惰匹配div:", lazy_div)

# 提取标签内容
content = re.findall(r"<div>(.*?)</div>", html)
print("提取的内容:", content)

# 处理多行文本(需要re.DOTALL标志)
multiline_text = """start
这是第一段内容
middle
这是第二段内容
end"""

# 匹配跨多行的内容
multiline_pattern = r"start.*?middle.*?end"
match = re.search(multiline_pattern, multiline_text, re.DOTALL)
if match:
    print("多行匹配结果:", match.group())

# 实际应用:提取所有链接
html_with_links = '<a href="link1.html">链接1</a><a href="link2.html">链接2</a>'
links = re.findall(r'<a href="(.*?)">(.*?)</a>', html_with_links)
print("提取的链接:", links)

核心就是:在 *+?{n,m} 这些量词后面加个 ? 就变成懒惰匹配了,比如 .*? 会匹配尽可能少的字符。

.*? 别用 .*

懒惰匹配是虾米?
re.findall(’((.*?))’, str1)

老铁 你这个不对啊

这个也不对的,懒惰就是尽可能少的重复

sorry 搞错了,你这个可以的

(?<=()\w*(?=))

回到顶部