zoukankan      html  css  js  c++  java
  • 标准模(三)、re模块(正则表达式模块)

    参考:https://docs.oracle.com/javase/tutorial/essential/regex/quant.html

       http://www.cnblogs.com/alex3714/articles/5161349.html

       http://blog.csdn.net/luoweifu/article/details/42759439

    正则表达式表示数量词的符号有三套:

    分别是

    一、Greedy(贪婪的);

    二、Reluctant(勉强的)

    三、Possessive(独占的)。

    其含意如下:
       

    Greedy

    数量词

    X?

    X,一次或一次也没有

    X*

    X,零次或多次

    X+

    X,一次或多次

    X{n}

    X,恰好 n 次

    X{n,}

    X,至少 n 次

    X{n,m}

    X,至少 n 次,但是不超过 m 次

    Reluctant                数量词

    X??

    X,一次或一次也没有

    X*?

    X,零次或多次

    X+?

    X,一次或多次

    X{n}?

    X,恰好 n 次

    X{n,}?

    X,至少 n 次

    X{n,m}?

    X,至少 n 次,但是不超过 m 次

    Possessive         数量词

    X?+

    X,一次或一次也没有

    X*+

    X,零次或多次

    X++

    X,一次或多次

    X{n}+

    X,恰好 n 次

    X{n,}+

    X,至少 n 次

    X{n,m}+

    X,至少 n 次,但是不超过 m 次

     
       
























































    原理讲解:

    Greedy数量词被称为“贪婪的”是因为匹配器被强制要求第一次尝试匹配时读入整个输入串,如果第一次尝试匹配失败,则从后往前逐个字符地回退并尝试再次匹配,直到匹配成功或没有字符可回退。

    模式串:.*foo

    查找串:xfooxxxxxxfoo

    结果:matched form 0 to 13

    Reluctant采用与Greedy相反的方法,它从输入串的首(字符)位置开始,在一次尝试匹配查找中只勉强地读一个字符,直到尝试完整个字符串。

    模式串:.*foo

    查找串:xfooxxxxxxfoo

    结果:matched form 0 to 4

          matched form 4 to 13

    Possessive数量词总是读入整个输入串,尝试一次(仅且一次)匹配成功,不像Greedy,Possessive从不回退,即便这样做也可能使整体匹配成功。

    模式串:.*foo

    查找串:xfooxxxxxxfoo

    结果:

          //未匹配成功

    其比较过程如下:

    常用正则表达式符号

    '.'     默认匹配除 之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
    '^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a"," abc eee",flags=re.MULTILINE)
    '$'     匹配字符结尾,或e.search("foo$","bfoo sdfsf",flags=re.MULTILINE).group()也可以
    '*'     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为['abb''ab''a']
    '+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab''abb']
    '?'     匹配前一个字符1次或0
    '{m}'   匹配前一个字符m次
    '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb''ab''abb']
    '|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
    '(...)' 分组匹配,re.search("(abc){2}a(123|456)c""abcabca456c").group() 结果 abcabca456c
     
     
    'A'    只从字符开头匹配,re.search("Aabc","alexabc") 是匹配不到的
    ''    匹配字符结尾,同$
    'd'    匹配数字0-9
    'D'    匹配非数字
    'w'    匹配[A-Za-z0-9]
    'W'    匹配非[A-Za-z0-9]
    's'     匹配空白字符、 、 、 , re.search("s+","ab c1 3").group() 结果 ' '
     
     最常用的匹配语法
    re.match 从头开始匹配
    re.search 匹配包含
    re.findall 把所有匹配到的字符放到以列表中的元素返回
    re.splitall 以匹配到的字符当做列表分隔符
    re.sub      匹配字符并替换
     

     

  • 相关阅读:
    Eclipse配置Maven私服
    ubuntu下使用Nexus搭建Maven私服
    Ubuntu系统的Redis安装配置
    centos7.6安装dpdk-stable-19.11.10
    微软的分布式应用框架 Dapr Helloworld
    Caddy源码阅读(二)启动流程与 Event 事件通知
    Caddy源码阅读(一)Run详解
    Caddy 源码全解析
    假装前端工程师(一)Icework + GitHub pages 快速构建可自定义迭代开发的 react 网站
    caddy & grpc(3) 为 caddy 添加一个 反向代理插件
  • 原文地址:https://www.cnblogs.com/pythonkids/p/7743412.html
Copyright © 2011-2022 走看看