正则表达式环视否定例子

使用正则表达式来搜索文本是高效快捷的方式 

比如要搜索下文中的红色字体,

<tr><td>123</td><td>test</td><td width=130>keyword is ok</td></tr>

 

首先,我写了一个这样的正则表达式:

reg = re.compile("<td[/s|/S]*keyword[/s|/S]*?</td>", re.I)

ret  = reg.search("<tr><td>test</td><td>keyword is ok</td></tr>") 

/s表示匹配空格,/S表示匹配非空格,将这两种情况加在一起:[/s|/S]就表示匹配任意字符,包括字母、数字、换行符、空格等等;*表示之前的[/s|/S]可以出现0次或多次,*?则表示懒惰匹配,也就是配备离keyword最近的一个</td>,使用这个表达式匹配的最后结果是:

<td>123</td><td>test</td><td width=130>keyword is ok</td>

也就是只去掉了<tr>和</tr>,而关键字“keyword”之前的<td>显然是过渡匹配了,

 

现在需要改进之前的那个正则表达式,需要否定keyword的之前出现的</td>,这样就可以保证获得的字符串中不含</td>.

这时候就需要用否定环视来解决了。否定环视的具体用法是:

 

表达式

说明

(?<=Expression)

逆序肯定环视,表示所在位置左侧能够匹配Expression

(?<!Expression)

逆序否定环视,表示所在位置左侧不能匹配Expression

(?=Expression)

顺序肯定环视,表示所在位置右侧能够匹配Expression

(?!Expression)

顺序否定环视,表示所在位置右侧不能匹配Expression

 

更详细的使用方法可以参考:http://blog.csdn.net/lxcnn/archive/2009/06/28/4304754.aspx

在这里,我将正则表达式改为

reg = re.compile("<td(?:(?<!</td>).)*?keyword[/s|/S]*?</td>", re.I)

(?:(?<!</td>).)*?表示在这个正则表达式的左侧,不能出现</td>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值