今天在处理数据的时候遇到一个,需要用正则表达式匹配不包含某字符的字符串的问题,用到否定匹配,现总结如下:

一个正则小知识 ↓
 []:表示范围,匹配其中任何一个
 {}:表示重复匹配多次。
 ():表示分组,意思就是括号内是一个整体。
----
(?=pattern)正向肯定环视。例如“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。
(?!pattern)正向否定环视。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern)反向肯定环视。例如“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern)反向否定环视。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
-----
关于环视有一个点需要注意就是,环视并不消耗字符,也就是说() 括号中的内容只是会被匹配一下,确定是否符合情况,如果不符合,环视结束之后
依然会从最原始的地方开始匹配。

举个栗子:
目标字符串:ABCDEFG
正则表达式:CD(?=EF)G
问:能否匹配到该字符串
答:不能
原因就在于环视不消耗字符,在这个例子匹配的过程中,首先CD匹配到了,然后环视右侧存在EF,继续匹配,但是注意此时继续匹配的点是从“D”开始的,
也就是说从“D”开始检查后面是不是“G”,那么当然不是,CD后面是EF,也就是说EF仅仅被查看,并没有被真的匹配。

import re

myList = ["退化草地;;;改良措施;","硫化氢;呼吸节律;"]

for data in myList:
    dataNew3 = re.match('^(?=.*;;).*$',data)
    print(dataNew3)
# 匹配带有三个连续英文分号的字符串,正向肯定环视。

(注:反向环视,不能出现不确定数目的字符表达式,比如不能有“.*”。正向没有要求。)