美文网首页
正则表达式高级使用

正则表达式高级使用

作者: 好多可乐 | 来源:发表于2019-02-14 00:33 被阅读0次

    一,贪婪与非贪婪

    贪婪:尽可能多的匹配

    非贪婪:尽可能少的匹配

    非贪婪符可以用在*,?,+的后面

    *?  重复1次

    ??  重复0次

    +?  重复0次

    代码如下:

    s ="greedyaiiii"

    reg1 ="greedyai*"  # 贪婪

    print(re.findall(reg1, s))   # 非贪婪

    reg2 ="greedyai*?"

    print(re.findall(reg2, s))

    运行结果为:

    ['greedyaiiii']

    ['greedya']

    二,分支条件匹配

    关键词:" | "

    代码如下:

    s ="my phone num=010-11111111 0599-2222222 020-2222222"

    reg3 ="0\d{2}-\d{8}|0\d{3}-\d{7}|0\d{2}-\d{7}"

    print(re.findall(reg3, s))

    运行结果为:

    ['010-11111111', '0599-2222222', '020-2222222']

    捕捉与非捕捉(?:)

    含义:

    非捕捉:不破坏正则表达式的整体性,匹配全部

    捕捉:捕捉连续符合正则表达式组内的最后一个组的内容

    -------------------------------------------------------------------------------

    现在我们有个需求,需要匹配IP地址

    正常情况下,我们这么写可以匹配出来

    ip ="address code: 128.0.0.1   125.125.125.125     0.0.0.0"

    reg4 ="(\d{1,3}\.){3}\d{1,3}"

    print(re.findall(reg4, ip))

    但是,这里实际的运行结果为 ['0.', '125.', '0.']

    原因是当分组时,会自动匹配捕捉模式,捕捉是是连续符合正则表达式组内的最后一个组的内容,所以这边匹配的就是每组的第三个

    这个时候我们需要用到不捕捉,关键字就是 ?:

    ip = "address code: 128.0.0.1 125.125.125.125 0.0.0.0"

    reg4 = "(?:\d{1,3}\.){3}\d{1,3}"

    print(re.findall(reg4, ip))

    这样得出的结果就是:['128.0.0.1', '125.125.125.125', '0.0.0.0']

    还有个例子如下:

    address ="http://www.baidu.com"

    reg5 ="http://(?:w){3}\.[a-z]*\.com"

    print(re.findall(reg5, address))

    零宽断言

    (?=reg) 匹配reg前面的内容

    (?<=reg)  匹配reg后面的内容

    (?!reg)  匹配后面跟的不是reg的内容

    (?<!reg)  匹配前面不是reg的内容

    例子如下:

    s1 ="hellogreedyailove"

    reg6 ="hel{2}o(?=greedyai)"

    print(re.findall(reg6, s1))

    这里匹配的就是greedyai前面的内容,故结果就是hello

    reg7="(?<=greedyai)[a-z]*"

    print(re.findall(reg7, s1))

    这里匹配的就是greedyai后面的内容,故结果就是hello

    reg8="lo(?!greedyai)"

    print(re.findall(reg8, s1))        

    这里返回的是love里面的lo,因为匹配的是后面跟着的不是greedyai的内容,前面hello里的lo后接greedyai

    reg9 ="(?

    print(re.findall(reg9, s1)) 

     返回的是hello的2个l,因为这里返回的是l前面不是greedyai的内容,那love里的l就被排除了

    相关文章

      网友评论

          本文标题:正则表达式高级使用

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