学习正则式(现学现卖)

自己一直没有正儿八经的学过正则式,虽知道原理,却一直没有咋用过。近来项目要用。所以只好现学。

首先用python写,建立一个文件。把乱七八糟的字符串往里丢呀。做了一个小实验,感觉与犹未尽。于是随便开了一个网页,找到源码。指定一行,然后写pattern.

我写的pattern比较简单。因为本来就简单。

比如你想匹配这样一段:

                      <div class="pd-dload">

<a href="/projects/inkscape/files/inkscape/Inkscape-0.47pre0-1.win32.exe/download" mce_href="projects/inkscape/files/inkscape/Inkscape-0.47pre0-1.win32.exe/download" class="button button-dload dload { url: 'http://downloads.sourceforge.net/sourceforge/inkscape/Inkscape-0.47pre0-1.win32.exe' }"  title="Inkscape-0.47pre0-1.win32.exe: 0.47pre0 released on Jul 02 2009"><span><b>Download Now!</b> Inkscape-0.47pre0-1.win32... (36.4 MiB)</span></a><small>OR</small><a href="/projects/inkscape/files/" mce_href="projects/inkscape/files/" class="button button-more"><span>View all files</span></a>
</div>



 

如果<div class ="pd-dload" >就出现过一次那就很简单。(多次的我还没有遇到,所以没有解决)pattern的最后结尾为</div>。那么应该是'<div class ="pd-dload" >XOXOXOXOXOX</div>'的形式,其中的那段怎么写呢?\w是匹配所有的字符[a-zA-Z0-9_],那么先用这个<div class ="pd-dload" >[\w]*?</div>,这里*?在python代表最小匹配,例如<abcd>siisis<ss>这样一个串,如果写<[\w]*>为其pattern,其中的>就无法匹配,但是你写<[\w]*?>就可将<abcd>匹配成功。

代码这样写:

import re f = open('C:\\Python31\\regular\\a.txt') content = f.read() print(content) reg = re.compile("<div class=\"pd-dload\">[\w]*?</div>") print(reg.findall(content))

结果是啥都没有[],现在将[\w]*?</div>去掉,变为<div class ="pd-dload" >,是不是可以匹配一部分?哈哈~那就是说后面的那个写的有问题。仔细看看你的那些字符,其中有可能有各种各样的字符例如\n、空格、:、“、’、.等。其中\s可以匹配很多诸如空格回车之类的符号,然后你再手工添加其他的符号.添加完毕后,pattern就为:<div class=\"pd-dload\">[\s\w|.:=?<>/\"\\\\-{}\'()!]*?</div>,记住这里\\\\其实就是对\进行匹配。将reg = re.compile("")中的做替换试试。发现还是[].

现在怎么办呢?方法很简单,一步一步的尝试。首先我匹配到:

<div

 class

="pd-dload"

>
<a

pattern为<div class=\"pd-dload\">[\s\w|.:=?<>/\"\\\\-{}\'()!]*?<a,然后出来结果了.继续向前找直到pipmak-0.2.7-windows.zip,这里会出现问题。我很奇怪的一点是\w可以匹配数字,为什么这里匹配不出来呢?最后想到了匹配这样串的简单方法[\d\D]*?,这样就包括了所有的情况.\d是所有的数字,\d是所有的非数字。合起来就是全部的字符。最后的pattern为: <div class=\"pd-dload\">[\d\D]*?</div>

我想应该有更加简单的pattern才对.

如果想知道到某一个匹配的串的中的内容,可以这样写:例如

<p class="pd-www"><a href="http://www.alliancep2p.com" class="link-external">http://www.alliance3p.com</a></p>
我希望能够找到
http://www.alliance3p.com,那应该怎么匹配呢?

f = open('XXX.txt') content = f.read() m = re.search('<p class=\"pd-www\">[\D\d]*?<a[\D\d]*?>([^"]+)</a>',content,re.IGNORECASE) print(m.group(1)) f.close()

不过使用re.search就只能找到一行匹配的代码。对于要找到多行匹配的代码,可以使用findall(),然后再自己写代码掐头去尾好了。或者将找到的串在使用re.search进行匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值