首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我怎样才能阻止这个正则表达式变得贪婪呢?

阻止正则表达式变得贪婪的方法是使用非贪婪匹配。在大多数正则表达式引擎中,可以通过在量词后面添加一个问号(?)来实现非贪婪匹配。例如,如果你有一个正则表达式,如 .*,它会尽可能多地匹配字符,你可以将其更改为 .*? 以实现非贪婪匹配,即尽可能少地匹配字符。

以下是一个简单的示例:

代码语言:python
代码运行次数:0
复制
import re

text = "This is a sample text."

# 贪婪匹配
greedy_pattern = r"(.+)"
greedy_match = re.search(greedy_pattern, text)
print(greedy_match.group(1))  # 输出:This is a sample text.

# 非贪婪匹配
non_greedy_pattern = r"(.+?)"
non_greedy_match = re.search(non_greedy_pattern, text)
print(non_greedy_match.group(1))  # 输出:T

在这个例子中,贪婪匹配会尽可能多地匹配字符,因此输出整个文本。而非贪婪匹配只会尽可能少地匹配字符,因此只输出第一个字符。

需要注意的是,并非所有的正则表达式引擎都支持非贪婪匹配,但大多数流行的编程语言和库都支持这种方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java性能调优--代码篇:优化正则表达式的匹配效率

但是我们是否真的了解正则表达式,它是如何匹配的?不同的匹配方式会带来怎样的效率差别?怎样才能做到效率最优? 本篇就对“如何优化正则表达式的匹配效率?”做深入探讨。 ? ?...1 匹配的三种方式 看下面这个例子,我们给定了一个字符串以及三个功能相同但写法略有区别的正则表达式: String testStr = "effg"; String regular_1 = "...): ef{1,3}g 贪婪模式是正则表达式的默认匹配方式,在该模式下,对于涉及数量的表达式,正则表达式会尽量匹配更多的内容,用模型图来演示一下匹配逻辑 ?...注意看第四步,字符g不满足匹配条件f{1,3},这个时候会触发回溯机制:指针重新回到第三个字符f处 ?...那么应该如何优化?这里给出特定情况下的两种优化建议: ? 优化建议 首先,如果分支中存在公共前缀可以提取公共部分 ?

5.2K11

Python正则表达式(上)

一、正则表达式介绍 正则表达式是什么?正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比模具做产品,而正则就是这个模具,定义一种规则去匹配符合规则的字符。...贪婪模式和非贪婪模式 (1)贪婪模式 贪婪模式是指在Python在默认情况下量词会尽可能多的匹配 print(re.findall("\d+","12345678888888abc")) # 尽量多的匹配...捕获组与非捕获组 分组是我们正则表达式中一个难点,把正则表达式的一部分用括号括起来作为一个组;主要包括捕获组()非捕获组(?:)如何进行捕获?...回到我们前面的案例,英文句子中匹配单词,怎样才能完整显示?...P=number01)\b","fdadd abcba")) 八、零宽断言 Python正则表达式的零宽断言有着不同的称呼:零宽度断言、预搜索、环视等等,它是干嘛的

1.5K40
  • 能用 AST 搞明白的正则语法,就不需要看文档

    但是正则表达式的学习还是有些难度的,比如贪婪匹配、非贪婪匹配、捕获子组、非捕获子组等概念,不止初学者难理解,有很多工作几年的人都不理解。 那正则表达式怎么学比较好?怎么快速掌握正则表达式?...推荐一个觉得很不错的学习正则的方式:通过 AST 来学习。 正则表达式的匹配原理是把模式串 parse 成 AST,然后通过这个 AST 去匹配目标字符串。...怎么查看正则表达式的 AST ? 可以通过 astexplorer.net 这个网站来可视化的查看: 切换 parse 的语言为 RegExp,就可以做正则表达式的 AST 的可视化。...分别是不同类型的量词: 有同学可能会问,这里的 greedy 属性是啥意思? greedy 是贪婪的意思,这个属性就表示这个 Repetition 是贪婪匹配还是非贪婪匹配。...,你就会发现 greedy 变成 false 了,也就是切换到了非贪婪匹配: 那贪婪和非贪婪是指啥? 我们看个例子就知道了。

    47810

    Python爬虫基础六:正则表达式

    在渐渐熟练这四种方法之后,个人的习惯是优先考虑Beautiful Soup 、Xpath,Xpath为第一考虑对象,感觉它是最方便的,嘿嘿嘿。 那么今天就先来看看,正则表达式。...二、正则表达式 先给大家安利一篇文章吧,《Python正则表达式,这一篇就够了!》 这篇文章也是在初学正则表达式时,比较受益的一篇文章。...刚开始学可能就会这样想,也这样想过。因为这是例子,是为了方便我们理解,如果是一个爬虫项目,解析出来的网页,那里的数据,可不是自己一点一点输入就能解决的。...感觉是可以的! 如: text = '你真的好nm"handsome"1+1=2帅' 这个够离谱了吧 但它就可以简单表示为: '你真的好.*帅' - - - '?'...爬虫第四步:保存结果 ,可以看我的第一个爬虫项目呀,也是这个页面,更有详细教你怎么爬取高清图和多页爬取,当然,使用的也是正则表达式哟。

    48970

    一个正则表达式酿成的惨案…

    字符 第三部分匹配许多字符 看着这个表达式发呆了许久,也没发现没有什么大的问题。...,你会发现因为贪婪匹配的原因,所以程序会一直读后面的字符串进行匹配,最后发现没有点号,于是就一个个字符回溯回去了。 这是这个正则表达式存在的第一个问题。...这是这个正则表达式存在的第二个问题。 解决方案 明白了回溯是导致问题的原因之后,其实就是减少这种回溯,你会发现如果在第三部分加上下划线和百分号之后,程序就正常了。 ?...但这是不够的,如果以后还有其他 URL 包含了乱七八糟的字符,我们难不成还再修改一遍。肯定不现实嘛! 其实在正则表达式中有这么三种模式:贪婪模式、懒惰模式、独占模式。...通过查阅网上资料,发现深圳阿里中心 LAZADA 的同学也在 17 年遇到了这个问题。

    56420

    藏在正则表达式里的陷阱

    看着这个表达式发呆了许久,也没发现没有什么大的问题。...而一旦发生回溯,那其消耗的时间就会变得很长,有可能是几分钟,也有可能是几个小时,时间长短取决于回溯的次数和复杂度。 看到这里,可能大家还不是很清楚什么是回溯,还有点懵。...,你会发现因为贪婪匹配的原因,所以程序会一直读后面的字符串进行匹配,最后发现没有点号,于是就一个个字符回溯回去了。 这是这个正则表达式存在的第一个问题。...这是这个正则表达式存在的第二个问题。 解决方案 明白了回溯是导致问题的原因之后,其实就是减少这种回溯,你会发现如果在第三部分加上下划线和百分号之后,程序就正常了。...但这是不够的,如果以后还有其他 URL 包含了乱七八糟的字符,我们难不成还再修改一遍。肯定不现实嘛! 其实在正则表达式中有这么三种模式:贪婪模式、懒惰模式、独占模式。

    19220

    藏在正则表达式里的陷阱,一个正则表达式导致CPU 利用率居高不下

    看着这个表达式发呆了许久,也没发现没有什么大的问题。...,你会发现因为贪婪匹配的原因,所以程序会一直读后面的字符串进行匹配,最后发现没有点号,于是就一个个字符回溯回去了。 这是这个正则表达式存在的第一个问题。...这是这个正则表达式存在的第二个问题。 解决方案 明白了回溯是导致问题的原因之后,其实就是减少这种回溯,你会发现如果在第三部分加上下划线和百分号之后,程序就正常了。...但这是不够的,如果以后还有其他 URL 包含了乱七八糟的字符,我们难不成还再修改一遍。肯定不现实嘛! 其实在正则表达式中有这么三种模式:贪婪模式、懒惰模式、独占模式。...本文中的这个正则表达式在进行了 11 万步尝试之后,自动停止了。这说明这个正则表达式确实存在问题,需要改进。 但是当我用我们修改过的正则表达式进行测试,即下面这个正则表达式

    1.4K20

    正则表达式和 CPU 100%有什么故事?

    看着这个表达式发呆了许久,也没发现没有什么大的问题。...,你会发现因为贪婪匹配的原因,所以程序会一直读后面的字符串进行匹配,最后发现没有点号,于是就一个个字符回溯回去了。 这是这个正则表达式存在的第一个问题。...这是这个正则表达式存在的第二个问题。 解决方案 明白了回溯是导致问题的原因之后,其实就是减少这种回溯,你会发现如果在第三部分加上下划线和百分号之后,程序就正常了。...但这是不够的,如果以后还有其他 URL 包含了乱七八糟的字符,我们难不成还再修改一遍。肯定不现实嘛! 其实在正则表达式中有这么三种模式:贪婪模式、懒惰模式、独占模式。...通过查阅网上资料,发现深圳阿里中心 LAZADA 的同学也在 17 年遇到了这个问题。

    1.4K20

    藏在正则表达式里的陷阱

    字符 第三部分匹配许多字符 看着这个表达式发呆了许久,也没发现什么大的问题。...而一旦发生回溯,那其消耗的时间就会变得很长,有可能是几分钟,也有可能是几个小时,时间长短取决于回溯的次数和复杂度。 看到这里,可能大家还不是很清楚什么是回溯,还有点懵。...,你会发现因为贪婪匹配的原因,所以程序会一直读后面的字符串进行匹配,最后发现没有点号,于是就一个个字符回溯回去了。 这是这个正则表达式存在的第一个问题;另外一个问题是在正则表达式的第三部分。...这是这个正则表达式存在的第二个问题。 解决方案 明白了回溯是导致问题的原因之后,其实就是减少这种回溯,你会发现如果在第三部分加上下划线和百分号之后,程序就正常了。...但这是不够的,如果以后还有其他 URL 包含了乱七八糟的字符,我们难不成还再修改一遍。肯定不现实嘛! 其实在正则表达式中有这么三种模式:贪婪模式、懒惰模式、独占模式。

    58670

    盘点Python正则表达式中的贪婪模式和非贪婪模式

    大家好,是皮皮。...一、前言 前几天在Python最强王者交流群有个叫【杰】的粉丝问了一个关于Python正则表达式的问题,其中涉及到Python正则表达式中的贪婪模式和非贪婪模式,讨论十分火热,这里拿出来给大家分享下,一起学习...解析如下图所示: 直到什么时候停止这个就是贪婪模式的匹配方式,那么非贪婪模式? 小彩蛋 分享一个【小王】大佬的代码,实现的效果是将正则匹配结果写成命名分组Python代码。...P=tag_mark)>.*") print(re.findall(tag, txt)) 总结 大家好,是皮皮。...这篇文章基于粉丝提问,针对Python正则表达式中的贪婪模式和非贪婪模式问题,给出了具体说明和演示,顺利的帮助粉丝解决了问题。

    85020

    讲给前端的正则表达式(4):避免灾难性回溯

    为了帮助我们理解问题,还分析了贪婪和懒惰量词以及为什么 lookahead 可能会有所帮助。 有些人遇到问题时会想:“知道,将使用正则表达式。”现在他们有两个问题了。...正则表达式带来的麻烦 来源:xkcd.com 如果你遇到了 Perl 的问题很为你担忧,孩子—— 遇到了99个问题, 所以我用了正则表达式, 现在有100个问题了。...我们可能想知道用这个表达式匹配多少个字母。 由于默认情况下量词是贪婪的,因此我们会匹配尽可能多的字母。可以用 match函数来确认这一点。 'Heeeeello!'....,我们告诉它重复尽可能少的次数,因此使其变得懒惰。...通过将贪婪量词更改为惰性量词,有时可以提高性能,但是这个特定的例子并不属于这种情况。 先行断言(Lookahead) 要解决上述问题,最直接方法是完全重写正则表达式

    57520

    藏在正则表达式里的陷阱

    看着这个表达式发呆了许久,也没发现没有什么大的问题。...,你会发现因为贪婪匹配的原因,所以程序会一直读后面的字符串进行匹配,最后发现没有点号,于是就一个个字符回溯回去了。 这是这个正则表达式存在的第一个问题。...这是这个正则表达式存在的第二个问题。 解决方案 明白了回溯是导致问题的原因之后,其实就是减少这种回溯,你会发现如果在第三部分加上下划线和百分号之后,程序就正常了。...但这是不够的,如果以后还有其他 URL 包含了乱七八糟的字符,我们难不成还再修改一遍。肯定不现实嘛! 其实在正则表达式中有这么三种模式:贪婪模式、懒惰模式、独占模式。...通过查阅网上资料,发现深圳阿里中心 LAZADA 的同学也在 17 年遇到了这个问题。

    2K211

    正则表达式之入门篇

    b*/; //匹配0或者1次a,再匹配任意次的b 现在问题来了,上面示例中的/a+/这个正则表达式,如果遇到了字符串'aaa',那么得到的匹配结果是什么这个就涉及到了我们下一节要介绍的内容。...因为贪婪匹配是默认值,所以当我们写正则表达式时,默认就是贪婪匹配。那么我们应该如何来表示非贪婪匹配?...(这个正则表达式匹配和回溯的原理有关,有兴趣的可以阅读的下一篇关于正则表达式的博客) 分支逻辑 在一个正则表达式中,我们会遇到做选择的情况。单个元素进行选择时,我们可以使用字符组。...但是,如果需要多个元素比如ab或者cd进行选择时,这个时候我们就需要分支逻辑。具体示例代码如下: const reg = /ab|cd/; //表示选择ab或者cd。为什么不是b和c?...后,匹配一个'b'或者'c',再匹配一个'd' 关于正则表达式优先级相关的讨论,我们在此就不做展开了,有兴趣的同学可以阅读的后一篇关于正则表达式高级进阶的文章。

    44810

    一个正则表达式引发的血案,让线上CPU100%异常!

    看着这个表达式发呆了许久,也没发现没有什么大的问题。...,你会发现因为贪婪匹配的原因,所以程序会一直读后面的字符串进行匹配,最后发现没有点号,于是就一个个字符回溯回去了。 这是这个正则表达式存在的第一个问题。...这是这个正则表达式存在的第二个问题。 解决方案 明白了回溯是导致问题的原因之后,其实就是减少这种回溯,你会发现如果在第三部分加上下划线和百分号之后,程序就正常了。...但这是不够的,如果以后还有其他 URL 包含了乱七八糟的字符,我们难不成还再修改一遍。肯定不现实嘛! 其实在正则表达式中有这么三种模式:贪婪模式、懒惰模式、独占模式。...通过查阅网上资料,发现深圳阿里中心 LAZADA 的同学也在 17 年遇到了这个问题。

    73210

    版本号的正则表达式-一看就懂的「正则表达式

    那么:   什么是正则表达式?   想象一下这样的场景:   1   你应该经常使用 「CTRL + F」在文本文件中搜索关键词,定位到自己想要看的地方。...2   你在爬取页面的时候,得到的一堆 HTML 标签版本号的正则表达式,但是你只是想拿到其中的关键文本信息,怎么快速剔除掉 HTML 标签,把自己想要的文本从里面提取出来?   ...4   你在使用命令行的时候,如何一步到位的管理相关的文件?比如 rm -rf * (咋这个目录下的文件都被删除了?)   ...   ...一个不带,它们有什么区别?   .*? 表示的是非贪婪匹配   .* 表示的是贪婪匹配   啥意思?   ...:   那么用在它们两身上,就是这样的,贪婪:   非贪婪:   意思就是这么个意思~   ok,这就是常常会使用到的正则表达式,在 Python 中,有个 re 库可以专门操作这些玩意的,你可以到下面这个链接看到具体的解释

    72910

    面试官:你竟然连这么简单的正则表达式都不会写?

    举个栗子:比如有一句 “爱祖国,是祖国的花朵” 现在要找到不是'的花朵'前面的祖国 用正则就可以这样写:祖国(?!的花朵)。 负向后行断言(负后顾) 语法:(?<!...这里所说的“内容”,是匹配结果,而不是子表达式本身,强调这个有什么用?嗯,先记住。 那这里所说的“使用”是怎样使用? 因为它的作用主要是用来查找一些重复的内容或者做替换指定字符。 还是举栗子吧。...:(w) 然后我们要用这个捕获组作为条件,那就可以:(w) 这样就大功告成了 可能有人不明白了,是什么意思?...在正则中,贪婪也是差不多的意思: 贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,这匹配方式叫做贪婪匹配。...一个量词就如此贪婪了, 那有人会问,如果多个贪婪量词凑在一起,那他们是如何支配自己的匹配权的

    86430

    正则表达式中的量词

    说明文本中以该字符开始的一段字符串可能会是我们需要的字符串,所以引擎接着向右读取正则表达式中的字符块和文本中的字符进行匹配。为了说明的方便,我们把这个字符记为A。...二、量词带来的不确定性 但是,引入了量词之后,事情就变得复杂了起来。量词可以让被修饰的字符重复若干次,如a*表示任意个a组成的字符串。...*>去匹配first yeah,以第一个和first,到底采用哪一种匹配?总不能靠运气吧。于是,在量词的基础上又给他分了三类。...之后引擎会读取正则表达式的.*,.可以匹配所有的字符,而*使.重复出现,而*又是贪婪的,所以引擎会不停地重复用.去匹配文本中的字符,直到读到文本的终结符,.和终结符匹配失败,这个时候.的重复次数达到最大了...*少匹配了文本中最后的h,引擎拿着这个h和正则表达式的>去匹配,匹配还是不成功,所以这个重复此时还是不行,再减一……直到重复次数为10为止,.

    10010

    不会正则表达式?看这篇就够了!

    举个栗子:比如有一句 “爱祖国,是祖国的花朵” 现在要找到不是'的花朵'前面的祖国 用正则就可以这样写:祖国(?!的花朵)。 负向后行断言(负后顾) 语法:(?<!...这里所说的“内容”,是匹配结果,而不是子表达式本身,强调这个有什么用?嗯,先记住。 那这里所说的“使用”是怎样使用? 因为它的作用主要是用来查找一些重复的内容或者做替换指定字符。 还是举栗子吧。...:(w) 然后我们要用这个捕获组作为条件,那就可以:(w) 这样就大功告成了 可能有人不明白了,是什么意思?...在正则中,贪婪也是差不多的意思: 贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,这匹配方式叫做贪婪匹配。...一个量词就如此贪婪了, 那有人会问,如果多个贪婪量词凑在一起,那他们是如何支配自己的匹配权的

    87220

    正则表达式真的很骚,可惜你不会写!

    分组 从上面的例子(4)中看到,*限定符是作用在与他左边最近的一个字符,那么问题来了,如果想要ab同时被*限定那怎么办正则表达式中用小括号()来做分组,也就是括号中的内容作为一个整体。...反向引用 上面讲到捕获,我们知道:捕获会返回一个捕获组,这个分组是保存在内存中,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用。...:(\w) 然后我们要用这个捕获组作为条件,那就可以:(\w)\1 这样就大功告成了 可能有人不明白了,\1是什么意思?...在正则中,贪婪也是差不多的意思: 贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,这匹配方式叫做贪婪匹配。...一个量词就如此贪婪了, 那有人会问,如果多个贪婪量词凑在一起,那他们是如何支配自己的匹配权的

    49900

    正则表达式引发的惨痛代价

    正则表达式引擎 正则表达式是一个用正则符号写出的公式,程序对这个公式进行语法分析,建立一个语法分析树,再根据这个分析树结合正则表达式的引擎生成执行程序(这个执行程序我们把它称作状态机,也叫状态自动机),...这些功能都是基于子表达式独立进行匹配,因此在编程语言里,使用的正则表达式库都是基于 NFA 实现的。 那么 NFA 自动机到底是怎么进行匹配的以下面的字符和表达式来举例说明。...既然回溯会给系统带来性能开销,那我们如何应对?如果你有仔细看上面那个案例的话,你会发现 NFA 自动机的贪婪特性就是导火索,这和正则表达式的匹配模式息息相关,一起来了解一下。 1....使用了 split() 方法提取域名,并检查请求参数是否符合规定。split() 在匹配分组时遇到特殊字符产生了大量回溯,当时是在正则表达式后加了一个需要匹配的字符和“+”,解决了这个问题。...下面就总结几种正则表达式的优化方法给你。 1. 少用贪婪模式,多用独占模式 贪婪模式会引起回溯问题,我们可以使用独占模式来避免回溯。前面详解过了,这里就不再解释了。 2.

    1.9K10
    领券