自己一直没有正儿八经的学过正则式,虽知道原理,却一直没有咋用过。近来项目要用。所以只好现学。
首先用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进行匹配。