我要爬爬虫(5)-正则表达式

正则之前就学过,也用过,这里再过一遍吧~
python中主要使用re模块操作正则。
正则表达式测试工具http://tool.oschina.net/regex/,直接把文本转成正则。

常用规则

\w 字母,数字,下划线
\W\w
\s\S 非空
\d 数字
\D 非数字
\n 换行
^ 字符串开头
. 任意非换行字符
* 匹配0个或多个表达式
+ 匹配一个或多个表达式
? 非贪婪方式
{n} n次表达式
a|b a或b
() 括号内目标字符串
\$ 字符串结尾(是$,不是\$)

match()

从目标字符串开头匹配,返回一个match类型的对象,需要调用group()方法返回匹配内容。

import re
content='Hello 123 4567 World_This is a Regex Demo'
result=re.match('^Hello\s\d{3}\s\d{4}\s(\w{10})',content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())

结果:

"""match()的返回对象里有group和span"""
<_sre.SRE_Match object; span=(0, 25), match='Hello 123 4567 World_This'>
"""group()返回匹配的所有字符串"""
Hello 123 4567 World_This
"""group(1)返回匹配的第一个目标字符串,若不止一个目标字符串,则可用group(2/3/4)来返回"""
World_This
"""span()返回匹配字符串在原字符串的位置"""
(0, 25)

匹配整个字符串,返回第一个结果,返回一个match类型的对象,需要调用group()方法返回匹配内容。

findall()

匹配整个字符串,返回所有匹配成功的结果,返回一个元素为元组的列表,可以直接输出,也可以使用下标输出指定元素。

sub()

替换指定文本
例如sub('.*?','zzz',content)意为content中所有非换行字符替换为zzz

import re
content='2016-12-12 11:22'
"""把后面的时分替换为空"""
pattern='\d+:\d+'
result=re.sub(pattern,'',content)
print(result)

可以输出2016-12-12

compile()

实例化正则字符串,作用在于,可以同时加入修饰符,如re.S,这样可以使pattern更加精炼。
pattern=re.comlile('\d+:\d+',re.S)

转义匹配

对于正则表达式中出现正则符号,如.,*,?之类的,需要在前面加反斜杠\,代表它并不作为正则符号来使用。

import re
content='http://www.baidu.com'
result=re.match('.*?w\.(.*?)\.',content)
print(result.group(1))

输出baidu

修饰符

一种对正则表达式的补充。
常用修饰符re.S,使正则表达式包括换行符。
re.I,使正则表达式不区分大小写。

import re
content='''aaaaaaaaaaaaaa
a 123 aaaaaaaa'''
result=re.match('.*?(\d+).*?',content,re.S)
print(result.group(1))

输出123

贪婪与非贪婪

?表示非贪婪方式,对其前面的正则式生效,使其尽量少的匹配目标,或者说先紧着旁边贪婪的(即尽量多的匹配)正则式匹配,匹配完了才轮到非贪婪匹配。
一般来说,为了精确匹配,多使用非贪婪方式。
不过,当匹配字符串末尾时,应使用贪婪方式,不然会匹配失败。

import re
content='Hello 123 4567 World_This is a Regex Demo'
"""这里目标取123"""
"""贪婪方式把前面的数字都取光了,只留了个7给\d+"""
result=re.match('^He.*(\d+).*Demo',content)
print(result.group(1))
"""非贪婪方式让\d+先取,把123取完"""
result=re.match('^He.*?(\d+).*Demo',content)
print(result.group(1))
"""这里目标取末尾的Demo"""
"""非贪婪方式后面没有字符了,所以取空也符合语法规则。。。"""
result=re.match('^.*\s(.*?)',content)
print(result.group(1))
"""所以在末尾应使用贪婪模式"""
result=re.match('^.*\s(.*)',content)
print(result.group(1))

结果:

7
123

Demo

strip(’X‘)常用的字符串处理函数,可以去掉首尾的指定字符X.
一般的,使用strip()来去掉首尾空格。

猜你喜欢

转载自blog.csdn.net/qq_18831501/article/details/80602444