• 正则的?:pattern, ?=pattern, ?!pattern学习整理


      真正学习这次正则知识前,我是被这道题给难住了:

    # 目标文本
    str1 = "ever1, ever2, never1, never2, never3, forever1, forever2, forever3"
    # 要求匹配到ever、forever  但是  不要never
    expected = ['ever1', 'ever2', 'forever1', 'forever2', 'forever3']

    方案1

    [^n](?:for|)everd*

    结果:

    [' ever2', ' forever1', ' forever2', ' forever3']

    由于[^n]即使没匹配到也会占用一个空格,所以只匹配到4条,第一个ever1无法匹配到(它前面无空格)

    因此这里需要的是,不保存结果的匹配,我也叫他为“约束”,自然引来了下一种

    方案2

    (?<!n)(?:for|)everd*  # 此种正则使用了反向预搜索,json不支持

    结果:

    ['ever1', 'ever2', 'forever1', 'forever2', 'forever3']

    终于达成目的

    Get1

    所以得出了所谓“预搜索”的作用,他只是约束,不参与匹配结果的生成。

    同样作用的,还有(?=pattern)  (?!pattern)  (?<=pattern)  (?<!pattern)    B  etc

    所以我最开始使用的[^n],他哪怕没有找到任何结果,都要占一个空格的坑,给匹配结果出一份力,就不属于这类“约束”语句

    Get2

    (?:pattern)不属于上类的预搜索,如例子中:(?:for|)的意思,后面接了for 或者空 他是会直接拼接匹配结果的。

    Get3

    (?=pattern) (?<=pattern)的区别,都是预搜索,前者为正向预搜索,后者反向预搜索。谈谈我的粗陋理解

    首先我们假定有个已经定死的,或者已经找到的东东叫book吧,然后以book为坐标原点

    book(?=pattern)    匹配得:book(后面满足pattern)

    所以正向匹配,遇到了book先不激动,再向右匹配,看是不是要的那个book,类似于:book(written by LuXun)

    (?<=pattern)book   匹配得:(前面满足pattern的)book

    所以逆向匹配,遇到了book后,反着向左匹配,看是不是所要的book, 类似于:(A good )book

    最后贴上python代码,方便练习

    str1 = "ever1, ever2, never1, never1, never2, never3, forever1222, forever2, forever3"
    regex = r"(?<!n)(?:for|)everd*"
    res = re.findall(regex, str1)
    print(res)
  • 相关阅读:
    mysql5.7 慢查底里失败的原因
    单体架构知识点及单体架构的缺陷
    分布式事务精华总结篇
    Kafka 消息丢失与消费精确一次性
    分布式柔性事务之最大努力通知事务详解
    Kafka面试题——20道Kafka知识点
    分布式柔性事务之事务消息详解
    奈学:数据湖有哪些缺点?
    奈学:数据湖和数据仓库的区别有哪些?
    了解概率知识,概率作为机器学习的底层逻辑
  • 原文地址:https://www.cnblogs.com/july401/p/10908437.html
Copyright © 2020-2023  润新知