鱼C论坛

 找回密码
 立即注册
查看: 1595|回复: 1

[已解决]python中正则贪婪模式和非贪婪模式

[复制链接]
发表于 2023-6-13 16:43:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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吗?为何打印出来的结果却截然相反呢?
最佳答案
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"。

所以,"贪婪模式"和"非贪婪模式"并不是决定匹配更多或者更少的字符,而是决定在满足正则表达式的情况下,通配符应该如何行为。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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"。

所以,"贪婪模式"和"非贪婪模式"并不是决定匹配更多或者更少的字符,而是决定在满足正则表达式的情况下,通配符应该如何行为。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 19:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表