正则表达式-进阶之定位与断言(python使用re模块及注意事项)

换一个高级点的在线工具(http://tool.chinaz.com/regex/),包含常用匹配和着色显示,很不错。

python中的调用方法

import re

txt = u'<a href="//csdn.net/488732" title="首页" class=""></a>'
par = re.compile(pattern=u"href=\"(\/\/[^\"]+)", flags=re.IGNORECASE)  #正则语句 忽略大小写标志

# 匹配方式有很多 这里是所有
matchs = re.findall(par, txt) 
print(matchs)

#for match in matchs: 可以for遍历输出
# 注意两种模式u和b   u可以表示unicode编码可以表示汉字 b表示字节码
                  # 正则语句要和txt输入的模式一致 都是b或者都是u

# 该代码测试可以成功运行

 

 

以前在做一些小的程序时候,突然发现基本的正则匹配已经满足不了我的需求了,我需要更加强大的功能。

定位:设定开始匹配和结束匹配的位置对于字符串的关系

断言:设定开始匹配和结束匹配的位置需要满足的要求

 

定位

我们仅需要在开始或结尾位置的匹配项 此时需要行定位符^和$   边界定位符\b和\B

假设:Boy!that boy is a good boy

boy 可以匹配一下结果

我们仅想匹配结尾位置的boy,则使用$表示字符串结尾位置

boy$ 匹配结果如下

如果想仅仅匹配开始位置的boy,使用^匹配字符串开始的位置

^boy 匹配结果如下

 

 

前面的两个字符用于匹配行开始和结尾,我们的\b则是用于匹配单词边界,包括,。-和空格,这些都算作单词边界

而\B则是与之相反的其他所有情况

look at that bird-girl,The girl will be my girlfriend.

对着这句话我们仅想匹配单词中包含girl,而不想匹配girl这个词。

[\B\-]girl|girl\B              //小例子 不一定很精确

 

 

断言

断言是一个假设的条件,它用于限定匹配字符串的前后关系,也就是我们常说的要求前面有什么后面有什么。

前向断言:(?<=pattern)   (?<!pattern) 

后向断言     (?=pattern)      (?!pattern) 

这两个类似于子匹配的形式不会出现在结果中,仅用于限定前后的模式,前向是用于限定前面的,后向是用于限定后面的。

=则表示肯定断言,即是什么                !则表示否定断言,即表示不是什么

拿两个非常具有代表性的例子说一下

假设有有这么一个xml文档,我们要提取这个文档有哪些标签。

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <class a_name = "12D">
        <student>
            <name>俄罗斯</name>
            <age>18</age>
            <sex>女</sex>
            <number>0037</number>
            <score>98</score>
        </student>
    </class>
</students>

我们可以看到,标签的规则是有一对<>包围,所以我们可以这么写正则匹配表达式

(?<=<)[a-z]+(?=>)

第二个例子就是比较绕口哈  

爱就是爱,我爱你,你爱我,这就是爱。
虽然他爱你,但是你不爱他,这就不是爱。  

 我们要寻找爱,但仅匹配前后是人称代词的

断言内部是匹配表达式,同样也是支持逻辑操作的

(?<=我|你|他)爱(?=我|你|他)

 

总结

这个东西知道有这么个用法,在实际中摸索一下就没有问题。

定位和断言给了我们对正则匹配更加精确的控制,非常good。

python中正则的使用已经写前面了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值