美文网首页
关于python正则表达式的补充

关于python正则表达式的补充

作者: 不分享的知识毫无意义 | 来源:发表于2019-12-08 16:42 被阅读0次

    1.贪婪匹配和非贪婪匹配

    • 贪婪匹配:顾名思义,贪婪,匹配满足条件越多越好
    • 非贪婪匹配,相反,匹配满足条件越少越好
      python默认是贪婪匹配,要想不贪在量词后面加个?警告就好了。
      举个栗子
    s1 = 'abcd我123'
    re.findall('[a-z]+',s1)
    输出:['abcd']
    re.findall('[a-z]+?',s1)
    输出:['a', 'b', 'c', 'd']
    

    2.()带来的误区

    • 没有括号
      没有括号很简单,你写的啥匹配啥
    • 一个括号
      整个正则表达式都去匹配,但是只输出括号里的东西
    • 两个括号
      输出一个list,list里的内容是tuple,包含了所有匹配结果和第一个括号里的匹配结果。
      举个栗子(虽然很不想,因为太简单)
    string="2345  3456  4567  5678"
    regex2 = re.compile("\w+\s+\w+")
    输出:['2345  3456', '4567  5678']
    regex2 = re.compile("(\w+)\s+\w+")
    输出:['2345', '4567']
    regex2=re.compile("((\w+)\s+\w+)")
    regex2.findall(string)
    输出:[('2345  3456', '2345'), ('4567  5678', '4567')]
    

    3.分组

    正则的分组是一个比较神奇的概念,一般是在re.match()中用到,分组代表匹配到的第几个结果。使用group[0-n]能获得匹配的第0-n个结果。我通常嫌这个麻烦,一般都用findall。
    举个栗子

    s='<div><a href="https://support.google.com/chrome/?p=ui_hotword_search" target="_blank">更多</a><p>dfsl</p></div>'
    re.match(r'.*<a.*>(.*)</a>',s)
    输出:<re.Match object; span=(0, 92), match='<div><a href="https://support.google.com/chrome/?>'
    是得不到你要的东西的
    re.match(r'.*<a.*>(.*)</a>',s).group()
    输出:<re.Match object; span=(0, 92), match='<div><a href="https://support.google.com/chrome/?>'
    整个正则表达式被当为第一组的内容啦,group里有没有0都是整个正则表达式的匹配。
    re.match(r'.*<a.*>(.*)</a>',s).group()
    输出:'更多'
    

    4.断言

    • (?:)
      用的最多,括号里的东西匹配上了但不输出,用的时候好好看看你的正则表达式和括号分组结合起来用,才能达到想要的正则效果。
    • (?<=pattern)
      以某个东西开头的匹配,括号里的东西不输出
    • (?!=pattern)
      不是以某个东西开头的东西,括号里的东西不输出
    • (?=pattern)
      以某个东西结尾的匹配,括号里的东西不输出
      -(?!=pattern)
      不以某个东西结尾的匹配,括号里的东西不输出
      这个东西也不是不好理解,那个例子先欠着,后续补上。

    5.正则 命名

    后续补充吧,目前还没用上。

    相关文章

      网友评论

          本文标题:关于python正则表达式的补充

          本文链接:https://www.haomeiwen.com/subject/pjumgctx.html