正则表达式(四)
断言
正则表达式中的大多数结构匹配的文本会出现在最终的匹配结果中,但是有些结构不匹配文本,而只负责判断被匹配文本的两侧是否符合要求。这种结构称为断言。常见的断言分为:单词边界、行起始和结束位置、环视。
单词边界
单词边界是使用\b为正则表达式加上边界,表示边界之外不再匹配非单词字符。如:\brow\b只能匹配row,\brow可以匹配row和rowdy,row\b可以匹配tomorrow和row,row可以匹配brown,row,rowdy,tomorrow。
import re strings = 'a sentence\tcontains-a\nlot#of$words' res = re.findall(r'\b\w+\b', strings) print(res)
结果
上述代码使用python进行的测试,\b\w+\b表示匹配单词字符组合,\b表示单词边界,不匹配所有非单词字符。如strings中空格、\、-、\t、\n、#、$都是非单词字符。
行起始/结束位置
单词边界也是定位匹配内容在字符串中的位置,行起始和行结束也是通过定位位置进行匹配查找的。其中^表示行起始的位置,例如^the,表示匹配查找起始为the的字符串,即以the开头的字符串;$表示行结束的位置,例如demo$,以demo结束的字符串,两者都是对匹配查找的字符串的位置进一步确定了。
环视
环视表示“停在原地,四处张望”,类似单词边界,旁边的文本满足某种条件,本身不匹配任何字符。
正则表达式<(?!/)中的环视结构为(?!/),表示匹配<,<之后不能是/。
正则表达式(?<!/)>中的环视结构为(?<!/),表示匹配>,>之前不能是/。可以看到(?<!/)环视结构中<,表示向左张望,(?!/)环视结构中,缺省默认向右张望。
环视分类
肯定顺序环视:(?=...),表示向右张望,是...
肯定逆序环视:(?<=...),表示向左张望,是...
否定顺序环视:(?!...),表示向右张望,不是...
否定逆序环视:(?<!...),表示向左张望,不是...
注意:python中完全支持顺序环视,但是逆序环视需要表达式中匹配文本必须为固定长度,即不能出现量词。如(?<=(\d{3}))、(?<!\d+)是python中不支持的。解决方法:使用多选结构,枚举少量匹配文本。
环视的组合
环视嵌套:例(?=(\d{3})(?!\d)),表示当前位置,向右张望,有三位数字,继续向右张望不是数字,即当前位置后有且仅有三位数字。
环视并列:例(?=\d)(?!9),表示当前位置,向右张望,有一位数字且数字不为9。