学习正则式(现学现卖)

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

首先用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 class = “pd-
dload” >XOXOXOXOXOX‘的形式,其中的那段怎么写呢?/w是匹配所有的字符[a-zA-Z0-9_],那么先用这个< div
class = “pd-dload” >[/w]?,这里?在python代表最小匹配,例如siisis这样一个串,
如果写<[/w]>为其pattern,其中的>就无法匹配,但是你写<[/w]?>就可将匹配成功。

代码这样写:

import re f = open(‘C://Python31//regular//a.txt’) content = f.read()
print(content) reg = re.compile(“

[/w]*?
“)
print(reg.findall(content))

结果是啥都没有[],现在将[/w]?去掉,变为< div class = “pd-dload” >,是不是可以匹配一部分?哈哈~那就是
说后面的那个写的有问题。仔细看看你的那些字符,其中有可能有各种各样的字符例如/n、空格、:、“、’、.等。其中/s可以匹配很多诸如空格回车之类的符号,然后你
再手工添加其他的符号.添加完毕后,pattern就为:

[/s/w|.:=?<>//“////-{}/‘()!]
?,记住这里////其实就是对/进行匹配。将reg =
re.compile(“”)中的做替换试试。发现还是[].

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

<div

 class

="pd-dload"

>  
         <a

pattern为

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

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

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

http://www.alliance3p.com


我希望能够找到 http://www.alliance3p.com,那应该怎么匹配呢?

f = open(‘XXX.txt’) content = f.read() m = re.search(‘

[/D/d]?<a[/D/d]?>([^”]+)‘,content,re.IGNORECASE) print(m.group(1))
f.close()

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

  • 本文作者: 帐前卒
  • 本文链接: http://chillyc.info/2009/4354779/
  • 版权声明: 本博客所有文章除特别声明外,只能复制超链接地址,且必须注明出处!