最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【教程】详解Python正则表达式之: (?!…) negative lookahead assertion 前向否定匹配 /前向否定断言

Python re crifan 4799浏览 0评论

Python 2.7的官网文档中的解释是:

(?!...)

Matches if ... doesn’t match next. This is a negative lookahead assertion. For example, Isaac (?!Asimov) will match 'Isaac ' only if it’s not followed by 'Asimov'.

下面,就来详细解释一下其中的含义:


1.negative lookahead assertion,此处我将其翻译为 前向否定匹配 或 前向否定断言

2.从字面意思就能看出,其含义是,从当前匹配的地方,继续向前看(lookahead),然后不希望(negative)找到对应的内容

其不论是语法还是所表示的含义,都正与:

【教程】详解Python正则表达式之: (?=…) lookahead assertion 前向匹配 /前向断言

相反;

 

关于示例代码,暂时就用回答某人的问题的那个代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Function:
【教程】详解Python正则表达式之: (?!…) negative lookahead assertion 前向否定匹配 /前向否定断言
https://www.crifan.com/detailed_explanation_about_python_regular_express_negative_lookahead_assertion

Author:     Crifan Li
Version:    2012-12-08
Contact:    admin at crifan dot com
"""

import re;

txt ="bn','dd_ff');xm_a([1,'zhangming',0,2,'yuwenjige','lishijige',1,0,3,1,0,0.999,1,1,0,0]);xm_a([2,'wangmeng',0,2,'shuxuejige','dilijige',1,0,3,1,0,0.999,1,1,1,0]);xm_a([3,'wangli',0,2,'shuxuejige','dilijige',1,0,2,0,0,0.999,1,1,1,0]);zuobi(6,3,'4:5');fg_gh('xxx','vb_4');xm_a([4,'dashan',0,2,'huaxuejige','yingyujige',1,0,3,1,1,0.999,0,1,0,0]);";

#下面是普通的,常见的那种,搜索符合某种格式的字符串
allJigeIncludeZuobi = re.findall("xm_a\(\[\d+,'(\w+)',[^\(\)\[\]]+\]\);", txt);
print allJigeIncludeZuobi; #['zhangming', 'wangmeng', 'wangli', 'dashan']

#而对于其中,想要排除掉某种特殊的情况
#比如此处希望后面不带作弊的,即后面没有zuobi字样的
#则就可以使用 前向否定匹配,添加上对应的,不希望出现的内容,就可以过滤掉,对应的项了
#此处就可以实现,过滤掉作弊那位:wangli
allJigeNoZuobi = re.findall("xm_a\(\[\d+,'(\w+)',[^\(\)\[\]]+\]\);(?!zuobi)", txt);
print allJigeNoZuobi; #['zhangming', 'wangmeng', 'dashan']

【总结】

negative lookahead assertion,就是,除了正常的搜索匹配之外,继续往前走两步,继续看看,不要出现某些内容

以达到,在正常匹配到的内容的基础上,过滤掉某种不想要的内容。

转载请注明:在路上 » 【教程】详解Python正则表达式之: (?!…) negative lookahead assertion 前向否定匹配 /前向否定断言

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
85 queries in 0.163 seconds, using 22.10MB memory