主要讲一下贪婪匹配和惰性匹配
贪婪匹配的原则就是从头开始,向后匹配直到最后一个匹配项,匹配后返回。
惰性匹配的原则就是从头开始,向后匹配直到第一个匹配项,匹配后返回。
举个例子:
s=re.finditer(r"(小.*游戏)","小明喜欢打游戏,小李喜欢打游戏,小王也喜欢打游戏")
for i in s:
print(i.group())
结果:
小明喜欢打游戏,小李喜欢打游戏,小王也喜欢打游戏
s=re.finditer(r"(小.*?游戏)","小明喜欢打游戏,小李喜欢打游戏,小王也喜欢打游戏")
for i in s:
print(i.group())
结果:
小明喜欢打游戏
小李喜欢打游戏
小王也喜欢打游戏
对结果的解释:正则匹配(小.*游戏)的意思是从“小”开始向后匹配,直到最远的“游戏”结束。
正则匹配(小.*?游戏)的意思是从“小”开始向后匹配,直到最远的“游戏”结束。
在系统中,匹配结果有三个:
- 小明喜欢打游戏
- 小明喜欢打游戏,小李喜欢打游戏
- 小明喜欢打游戏,小李喜欢打游戏,小王也喜欢打游戏
.*匹配选择第三个结果并输出
.*?选择第一个结果并输出
匹配字符串中所有的符合要求的内容。
返回值是列表。
lst=re.findall(r"\d+","我的电话号码是11111,你的电话号码是22222")
print(lst)
结果:[‘11111’, ‘22222’]
匹配字符串中所有符合要求的内容。
返回值是迭代器。
it=re.finditer(r"\d+","我的电话号码是11111,你的电话号码是22222")
for i in it:
print(i.group())
结果:11111 22222
从头开始匹配,匹配到第一个符合要求的则返回。
返回值时match对象,从中取数据需要使用.group1方法。
s=re.search(r"\d+","我的电话号码是11111,你的电话号码是22222")
print(s.group())
结果:11111
以第一个字符为开始,向后匹配。
返回的是match对象,从中取数据需要使用.group1方法。
m=re.match(r"\d+","我的电话号码是11111,你的电话号码是22222")
print(m.group())
这里Python会报错
显示没有匹配结果。因为match是从“我”开始匹配的,向后没有匹配到数字,返回空值。
改成以下的字符则会显示结果:
m=re.match(r"\d+","11111,你的电话号码是22222")
print(m.group())
结果:11111
compile的作用是对正则表达式进行预加载,这样做可以提高之后匹配的效率
obj=re.compile(r"\d+")
s=obj.finditer("我的电话号码是11111,你的电话号码是22222")
for i in s:
print(i.group())
结果:11111 22222
在开源中国上有一个在线的正则表达式测试平台:https://tool.oschina.net/regex
上面可以输入待匹配的文本和正则表达式,用于测试表达式的正确性。
网页右侧也给出了一些常用的正则表达式的例子,可以供参考
s="小明" \
"小王" \
"小李" \
"小周"
#re.S的作用是让.能匹配换行符
#先加上括号,然后加上 ?P<分组名字>,之后就可以选定从该组中提取数据
obj=re.compile(r"",re.S)
result=obj.finditer(s)
for i in result:
print(i.group('rest1'),end=' ')
结果:
a b c d
解释:
正则匹配稍显复杂,目的就是提取class,从
就将结果记录到rest1分组中。
起别名的规则就是在需要起名字的地方先加一个括号(),括号里面加上?P,name表示自己取的名字。
在这个例子中,就是起了rest1名字。
起别名在爬虫中非常实用,当网页源代码很长,而我们想要提取的东西又十分多时,通过给各各分组起名字的方法,将每个分组分类,代码看起来显得很有条理。