正则表达式环视匹配(?=pattern)、(?!pattern)、(?<=pattern)、(?<!pattern)怎么用
今天在处理数据的时候遇到一个,需要用正则表达式匹配不包含某字符的字符串的问题,用到否定匹配,现总结如下:
一个正则小知识 ↓
[]:表示范围,匹配其中任何一个
{}:表示重复匹配多次。
():表示分组,意思就是括号内是一个整体。
----
(?=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)
# 匹配带有三个连续英文分号的字符串,正向肯定环视。
(注:反向环视,不能出现不确定数目的字符表达式,比如不能有“.*”。正向没有要求。)
好看请赞,养成习惯:) 本文来自博客园,作者:靠谱杨, 转载请注明原文链接:https://www.cnblogs.com/rainbow-1/p/17131488.html
欢迎来我的51CTO博客主页踩一踩 我的51CTO博客
文章中的公众号名称可能有误,请统一搜索:靠谱杨的秘密基地