换一个高级点的在线工具(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中正则的使用已经写前面了。