python小小白哟 发表于 2023-6-13 16:43:37

python中正则贪婪模式和非贪婪模式

本帖最后由 python小小白哟 于 2023-6-13 16:45 编辑

非贪婪模式:
import re

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+).*Demo$',content)
print(result)
print(result.group(1))

贪婪模式:
import re

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$',content)
print(result)
print(result.group(1))


其中加了?表示的是非贪婪模式,也就是表示的是匹配较少的字母,然后非贪婪模式打印出来的不是 123456吗?贪婪模式匹配到的会比非贪婪多的,贪婪模式结果打印出来的是7吗?为何打印出来的结果却截然相反呢?

isdkz 发表于 2023-6-13 16:52:38

这个问题的关键在于理解正则表达式中的"贪婪匹配"和"非贪婪匹配"。"贪婪"和"非贪婪"描述的是正则表达式中通配符 * 、 + 、 ? 、 {m,n} 的行为。

在默认的"贪婪模式"下,正则表达式会尽可能多地匹配字符串。而在"非贪婪模式"下,正则表达式会尽可能少地匹配字符串。在Python的 re 模块中,可以通过在这些通配符后面添加 ? 来开启"非贪婪模式"。

以你的例子为例:

非贪婪模式:
import re

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+).*Demo$',content)
print(result.group(1))# prints: 1234567

这里 .*? 是非贪婪的,它尽可能少地匹配字符,直到找到第一个数字字符( \d )。然后 (\d+) 匹配一串数字,直到找到一个非数字字符为止。因此, result.group(1) 返回的是字符串"1234567"。

贪婪模式:
import re

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$',content)
print(result.group(1))# prints: 7

这里 .* 是贪婪的,它尽可能多地匹配字符,直到字符串的末尾,然后开始回溯,直到找到一个数字字符。然后 (\d+) 匹配一串数字,直到找到一个非数字字符为止。因此, result.group(1) 返回的是字符串的最后一个数字"7"。

所以,"贪婪模式"和"非贪婪模式"并不是决定匹配更多或者更少的字符,而是决定在满足正则表达式的情况下,通配符应该如何行为。
页: [1]
查看完整版本: python中正则贪婪模式和非贪婪模式