python的正则表达式库re
正则的常用符号
. 匹配任一字符,换行符\n除外
* 匹配前一个字符0次或无限次
? 匹配前一个字符0次或1次
.* 贪心算法(尽可能多的匹配)
.*? 非贪心算法(尽可能少的匹配)
() 括号内的数据作为结果返回
以下简单介绍几个主要函数的用法
re.match
说明:从字符串的第一个位置开始匹配,匹配到返回,m =re.match("正则表达式",字符串))
import re
m = re.match('"goUrl":"([^"]*)"',response)
print(m.group(0),m.group(1))
print(m.groups())
解释:re.match()中第一个参数为要匹配的正则表达式(正则表达式用单双引号括起来,但是如果里面本身包含双引号,可以用单引号括起来),第二个为要提取的原始文件字符串。
group(0)为提取到的包含goUrl的全部正则内容。group(1)为正则表达式第一个括号内的内容,当然也可以有两个括号,那就用group(2)来返回,groups()返回一个元祖,所有括号内的内容
match取到一个字符串后返回
re.search
说明:在整个字符串中匹配到第一个正则后返回数据,返回一个正则表达是对象(object)
import re
m = re.search('"goUrl":"([^"]*)"',response)
print(m.group(0),m.group(1))
与match的区别:match是从字符串开始进行匹配;search是从字符串的任何部分开始匹配
search也是最多匹配到一个字符串,然后就退出了,group用法与match一样
re.findall
说明:返回字符串中满足正则表达式的所有字符串。返回结果是一个列表[]
import re
m = re.findall('"goUrl":"([^"]*)"',response)
print(m)
解释:正则也可以用(),然后列表中的每一个子项,可以用group()来取出来括号内的内容
re.compile
说明:将经常使用的正则表达式编译成一个正则表达式对象,使用更方便
import re
m = re.compile('"goUrl":"([^"]*)"')
print(m.findall(response))
print(m.search(response))
print(m.match(response))
解释:使用compile与单独使用findall等操作是一样的
re.sub
说明:将匹配到正则的所有字符串替换为另一个字符串,返回结果是一个字符串
import re
m = re.sub("正则表达式","要替换的内容",源文件)
print(m.findall(response)
注意:要替换的内容可以用("%d"%789)来通过外部参数替换要替换的内容
re.split
说明:按照正则进行分割,返回一个列表(列表内容不包含分隔符)
import re
m = re.split("正则表达式分隔符",源文件)
print(m)
re.split和python的split的区别:
1.如果分割符是固定字符串,两个可以混用。re.split("goUrl",response)等价于response.split("goUrl")
2.re.split可以用正则表达式分割,比如re.split("[0-9]*",response),而python的split只能用string类型的字符串分割。
re.S
说明:是一个参数,多行匹配。如果不用re.S则在单行中进行匹配,如果用了re.S则在整体中进行字符匹配
re.M
说明:是一个参数,^$标志将会匹配每一行。默认情况下是只匹配符合正则的第一行和最后一行
一些小技巧:
1.先抓大再抓小
例子a.html如下:
<div class="topic"><a href="xxx"></a>
<div class="list">
<ul>
<li><a href="xxx/1.html">这是第一条</a></li>
<li><a href="xxx/1.html">这是第二条</a></li>
<li><a href="xxx/1.html">这是第三条</a></li>
</ul>
</div>
</div>
想要抓出这是第一条、这是第二条、这是第三条;如果用'>(.*?)</a>'会抓取到第一行。这时就可以先抓大再抓小,即读取到<ul>,然后再获得下面的'></a>'的内容
text_fied=re.findall('<url>(.*?)</ul>'),a.html
更多关于re的操作可以参照官网:https://docs.python.org/3.1/library/re.html