正则系列2: re.search用法

re.search

re.search扫描整个字符串并返回第一个成功的匹配。
该方法有3个参数,第一个就是你写的正则表达式,第二个匹配的目标字符串,第三个是一个匹配模式
re.search(pattern, string, flags=0)

  • 先看一个re.match例子,之后我们对比search。
#我们需要拿到Hello 1234567 World_This is a Regex Demo 这一部分
import re

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
result = re.match('Hello.*?(\d+).*?Demo',content)
print(result)

结果:
None

我们发现用match的输出结果是None,也就是说pattern最开头和content字符串最开头是不匹配的。那么整个的匹配就会失败。

  • 接下来看re.search,代码不变,只是re.match变成re.search,来看下结果
import re

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
result = re.search('Hello.*?(\d+).*?Demo',content)
print(result)
print(result.group(1))

结果:
<_sre.SRE_Match object; span=(13, 53), match=‘Hello 1234567 World_This is a Regex Demo’>
1234567

也就是说pattern搜索的时候,是从字符串Extra开始的,用match的话,正则表达式从Hello开始是不行的,但用re.search就会搜索,不会管开头一致不一致。

总结:为匹配方便,能用search就不用match,match方法限定匹配时,头部必须是一致的

  • 匹配演练:最后我们做些匹配演练,实战下
import re

html='''

经典老歌

经典老歌列表

'''

上面是html代码,要求匹配出 第3个li标签中的齐秦 往事随风 ,代码如下:

result = re.search('(.*?)',html,re.S)#re.S确保.能匹配到换行符
if result:
    print(result.group(1),result.group(2))

结果:
齐秦 往事随风

我们还要求匹配出第二个li标签中的内容 任贤齐 沧海一声笑

result = re.search('(.*?)',html,re.S)
if result:
    print(result.group(1),result.group(2))

结果:
任贤齐 沧海一声笑

如果匹配时候不需要匹配换行符,那么参数中就没必要带re.S,比如匹配第4个和第5个li标签中的歌手和歌名。但是re.search也仅仅是返回一个符合匹配的结果。如果我们要返回符合匹配的所有结果,要用到re.findall。这一节的re.search就说到这里。

你可能感兴趣的:(正则表达式)