zoukankan      html  css  js  c++  java
  • 正则表达式之断言

    正则表达式(四)

      断言

      正则表达式中的大多数结构匹配的文本会出现在最终的匹配结果中,但是有些结构不匹配文本,而只负责判断被匹配文本的两侧是否符合要求。这种结构称为断言。常见的断言分为:单词边界、行起始和结束位置、环视。

      单词边界

      单词边界是使用为正则表达式加上边界,表示边界之外不再匹配非单词字符。如:row只能匹配row,row可以匹配row和rowdy,row可以匹配tomorrow和row,row可以匹配brown,row,rowdy,tomorrow。

    import re
    
    strings = 'a sentence	contains-a
    lot#of$words'
    
    res = re.findall(r'w+', strings)
    print(res)

      结果

      上述代码使用python进行的测试,w+表示匹配单词字符组合,表示单词边界,不匹配所有非单词字符。如strings中空格、、-、 、 、#、$都是非单词字符。

     行起始/结束位置

      单词边界也是定位匹配内容在字符串中的位置,行起始和行结束也是通过定位位置进行匹配查找的。其中^表示行起始的位置,例如^the,表示匹配查找起始为the的字符串,即以the开头的字符串;$表示行结束的位置,例如demo$,以demo结束的字符串,两者都是对匹配查找的字符串的位置进一步确定了。

       环视

      环视表示“停在原地,四处张望”,类似单词边界,旁边的文本满足某种条件,本身不匹配任何字符。

      正则表达式<(?!/)中的环视结构为(?!/),表示匹配<,<之后不能是/。

      正则表达式(?<!/)>中的环视结构为(?<!/),表示匹配>,>之前不能是/。可以看到(?<!/)环视结构中<,表示向左张望,(?!/)环视结构中,缺省默认向右张望。

      环视分类

      肯定顺序环视:(?=...),表示向右张望,是...

      肯定逆序环视:(?<=...),表示向左张望,是...

      否定顺序环视:(?!...),表示向右张望,不是...

      否定逆序环视:(?<!...),表示向左张望,不是...

      注意:python中完全支持顺序环视,但是逆序环视需要表达式中匹配文本必须为固定长度,即不能出现量词。如(?<=(d{3}))、(?<!d+)是python中不支持的。解决方法:使用多选结构,枚举少量匹配文本。

      环视的组合

      环视嵌套:例(?=(d{3})(?!d)),表示当前位置,向右张望,有三位数字,继续向右张望不是数字,即当前位置后有且仅有三位数字。

      环视并列:例(?=d)(?!9),表示当前位置,向右张望,有一位数字且数字不为9。

  • 相关阅读:
    fill 全解(转)
    解题报告 疯狂的馒头
    解题报告 报数
    解题报告 noi 2005 智慧珠游戏(BT 搜索)
    解题报告 跑步
    解题报告 Punch
    解题报告 纪念日
    解题报告 新兵站队
    转载:让理科生沉默,让文科生流泪的综合题
    解题报告 信号放大器
  • 原文地址:https://www.cnblogs.com/snow-lanuage/p/10538409.html
Copyright © 2011-2022 走看看