首先给出一份更加详细的常用匹配规则,平常的使用中基本就用到这些规则。
接下来开始分享在python中常用的爬虫函数:
1.match方法:match方法会从字符串的起始位置匹配正则表达式
import re
content='hello 123 456 7890 World_this is a Regec demo'
# 用^匹配字符的开头,\s匹配一个空格,\d匹配数字,{n}精确匹配个前面的字符,\w匹配任意字符
result=re.match('^hello\s\d\d\d\s\d{3}\s\d{4}\s\w{10}',content)
print(result)
print(result.group())
print(result.span())
其中group方法显示匹配到的内容,可以在匹配规则中加入(),括号的内容可以由group(1)这样的方式输出,span方法显示匹配到的范围。下面是输出结果:
<_sre.SRE_Match object; span=(0, 29), match='hello 123 456 7890 World_this'>
hello 123 456 7890 World_this
(0, 29)
2.通用匹配:
在真正的匹配是,不可能全部用匹配规则的方法,所以就有了通用匹配:.* 其中.表示匹配任意字符,*表示匹配前面的字符无限次,就组成了通用的匹配符号,上代码:
import re
content='hello 123 456 7890 World_this is a Regec demo'
#点星匹配了中间的所有字符
result=re.match('^hello.*demo$',content)
print(result)
print(result.group())
print(result.span())
输出结果:
<_sre.SRE_Match object; span=(0, 45), match='hello 123 456 7890 World_this is a Regec demo'>
hello 123 456 7890 World_this is a Regec demo
(0, 45)
说到通用匹配就要讲到贪婪与非贪婪,单纯用.*属于贪婪,他会尽可能多的匹配字符,如下实例:
import re
content='hello 1234567890 World_this is a Regec demo'
#贪婪的方式
result=re.match('^he.*(\d+).*mo$',content)
#非贪婪
newresult=re.match('^he.*?(\d+).*mo$',content)
print(result)
print(result.group(1))
print(newresult)
print(newresult.group(1))
<_sre.SRE_Match object; span=(0, 43), match='hello 1234567890 World_this is a Regec demo'>
0
<_sre.SRE_Match object; span=(0, 43), match='hello 1234567890 World_this is a Regec demo'>
1234567890
下面这张图为结果,当使用贪婪的方式的时候,他尽可能多的匹配字符,导致(\d+)只得到了最后一个数字,显然有些时候我们想得到的是整个数字的字符串,这个时候就需要非贪婪的方式 .*? ,用过非贪婪的方式就得到了整个数字字符串。
3.修饰符
在match方法的最后加入修饰符,即可起到相应的修饰作用,如当需要匹配的文本中有换行符时,不加任何修饰的话.*就无法匹配到后面一行的内容,这个时候可以通过在方法的最后加 re.S。如:
result=re.match('^he.*(\d+).*mo$',content,re.S)
下面给出修饰符的表格:
4.search
match只能从头开始匹配,search会返回第一个成功匹配的结果,search的用法和match类似,也可以用group输出内容。
re.search(匹配规则,内容,修饰符)
5.findall
search只能返回第一个成功匹配的结果,而findall可以返回所有匹配成功的结果,以列表的形式给出
6.sub
使用sub可以替换字符,这里用空字符代替所有数字
#使用sub替换掉所有数字
content='123sdf5asd1f23s4df'
#第一个参数是正则表达式规则匹配到的内容,第二个参数是替换成的内容,第三个参数是原字符串
result=re.sub('\d+','',content)
print(result)
结果
sdfasdfsdf
7.compile
这个函数可以将正则表达式的规则编译成正则表达式的对象,供多次使用
如:
import re
content='hello 123 456 7890 World_this is a Regec demo'
pattern=re.compile('^hello.*demo$')
#点星匹配了中间的所有字符
result=re.match(pattern,content)
print(result)
print(result.group())
print(result.span())