正则表达式之断言

正则表达式(四)

  断言

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

  单词边界

  单词边界是使用为正则表达式加上边界,表示边界之外不再匹配非单词字符。如: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。

原文地址:https://www.cnblogs.com/snow-lanuage/p/10538409.html