掘金 人工智能 07月29日 14:22
Python——正则表达式(字符匹配-贪婪模式)
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了Python正则表达式中的贪婪模式和非贪婪模式,重点讲解了量词符如{m,n}、*、+、?在不同模式下的匹配行为。文章通过一系列清晰的Python代码示例,直观展示了贪婪模式如何尽可能多地匹配字符,而非贪婪模式(通过在量词后加?实现)如何尽可能少地匹配字符。理解并灵活运用这两种模式,是精确控制正则表达式匹配行为的关键,能够帮助开发者更高效、准确地处理文本数据。

💰 **贪婪模式的量词符行为**:在Python的`re`模块中,像`{m,n}`这样的量词符默认采用贪婪模式,会尽可能多地匹配满足条件的字符。例如,`r"ab{2,4}"`会优先匹配'abbb'而不是'abb'或'abbbb'。当`n`被省略时(如`r"ab{2,}"`),它会匹配至少`m`次,直至字符串末尾。当`m`被省略时(如`r"ab{,4}"`),它会匹配0到4次。

🌟 **非贪婪模式的引入**:为了实现尽可能少的匹配,可以在贪婪量词符后添加一个问号`?`,将其转变为非贪婪模式。例如,`r'<.*?>'`会匹配到第一个`>`就停止,而不是匹配到最后一个。同样,`r"ab{2,4}?"`会尝试匹配最少的次数,例如在"abbbbc"中,它会匹配'abb'。

🎯 **通配符的非贪婪应用**:常见的贪婪通配符如`*`(匹配零次或多次)、`+`(匹配一次或多次)和`?`(匹配零次或一次),都可以通过在其后添加`?`来变为非贪婪模式。例如,`p = re.compile(r"ab+?")`在匹配"abbbc"时,会选择匹配最少的`b`,即`ab`;而`p = re.compile(r"ab??")`在匹配"abc"时,会选择匹配最少的`b`,即`a`。

区别在于是否加?,同理在{}中也是如此

贪婪模式

{m,n}

    对其之前的正则表达式进行 m 到 n 次匹配,在 m 和 n 之间取尽量多(贪婪方式)忽略 m 则下限默认为 0,忽略 n 则上限默认为无限次(逗号不能省 略)
import rep = re.compile(r"ab{2,4}") print(p.search("abc"))       #Noneprint(p.search("abbc"))      #<re.Match object; span=(0, 3), match='abb'>print(p.search("abbbc"))     #<re.Match object; span=(0, 4), match='abbb'>print(p.search("abbbbc"))    #<re.Match object; span=(0, 5), match='abbbb'>print(p.search("abbbbbc"))   #<re.Match object; span=(0, 5), match='abbbb'>p = re.compile(r"ab{,4}")print(p.search("ac"))        #<re.Match object; span=(0, 1), match='a'>print(p.search("abc"))       #<re.Match object; span=(0, 2), match='ab'>p = re.compile(r"ab{2,}")print(p.search("abbbbc"))   #<re.Match object; span=(0, 5), match='abbbb'>print(p.search("abbbbbc"))  #<re.Match object; span=(0, 6), match='abbbbb'>

非贪婪模式

*? +? ??

    " * + ? "都是贪婪的,它们对字符串进行尽可能多的匹配,有时候并不需要这种行为,可以在之后添加?,就可以以非贪婪的方式进行匹配,则尽可能少的字符将会被匹配
import rep = re.compile(r'<.*>')print(p.search('<a> b <c>')) #<re.Match object; span=(0, 9), match='<a> b <c>'>p = re.compile(r'<.*?>')print(p.search('<a> b <c>')) #<re.Match object; span=(0, 3), match='<a>'>p = re.compile(r"ab+?")print(p.search("abbbc"))  #<re.Match object; span=(0, 2), match='ab'>p = re.compile(r"ab??")print(p.search("abc"))  #<re.Match object; span=(0, 1), match='a'>

{m,n}?

    {m,n} 的非贪婪模式
import rep = re.compile(r"ab{2,4}?")print(p.search("abc"))    #Noneprint(p.search("abbc"))   #<re.Match object; span=(0, 3), match='abb'>print(p.search("abbbc"))  #<re.Match object; span=(0, 3), match='abb'>print(p.search("abbbbc"))  #<re.Match object; span=(0, 3), match='abb'>print(p.search("abbbbbc"))  #<re.Match object; span=(0, 3), match='abb'>

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Python 正则表达式 贪婪模式 非贪婪模式 量词符
相关文章