python re.search正则表达式

re.search 扫描整个字符串并返回第一个成功的匹配,并不要求必须从字符串的开头进行匹配,也就是说,正则表达式可以是字符串的一部分。

re.search 函数语法:

re.search(pattern, string, flags=0)

re.search 函数参数说明:

参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

匹配成功re.search方法返回一个匹配的对象,否则返回None。 我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法 描述
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号

re.search 目录

re.search 如何使用

# 导入正则表达式需要的re模块
import re

# 使用search方法进行匹配操作
result = re.search('正则表达式', '要匹配的字符串','修饰符')

# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()

re.match与re.search的区别

re.match 正则表达式

# 导入正则表达式需要的re模块
import re

# 1.匹配结果
res = re.match("python", "我正在学习 python 的正则表达式,您能提炼出 python 关键字吗?")
print(res)
# 输出结果: None
# re.match 必须开头是python,因为它必须从开头进行匹配
print(res.group())  # 没有匹配数据执行此语句报错如下:
'''
Traceback (most recent call last):
    print(res.group())
AttributeError: 'NoneType' object has no attribute 'group'
'''

re.search 正则表达式

# 导入正则表达式需要的re模块
import re

# 1.匹配结果
res = re.search("python", "我正在学习 python 的正则表达式,您能提炼出 python 关键字吗?")
print(res)
# 输出结果: <re.Match object; span=(6, 12), match='python'>
print(res.group())  # 获取匹配数据
# 虽然在字符串中有2个python关键字,但search只会返回第一匹配的结果,所以返回第一个 python

总结:re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search 匹配整个字符串,直到找到一个匹配。

re.search 正则表达式不能匹配到结果的情况

# 导入正则表达式需要的re模块
import re
# search 正则表达式未匹配到结果
res = re.search("java", "我正在学习 python 的正则表达式,您能提炼出 python 关键字吗?")
print(res)
# 输出结果:None

re.search 通过正则表达式输出匹配位置和原配字符串

# 导入正则表达式需要的re模块
import re
res = re.search("python", "我正在学习 python 的正则表达式,您能提炼出 python 关键字吗?")
print(res.start())  # 匹配字符串的开始位置
# 输出结果:6
print(res.end())    # 匹配字符串的结束位置
# 输出结果:12
print(res.span())   # 匹配字符串的元组(开始位置+结束位置)
# 输出结果:(6, 12)
print(res.string)   # 匹配字符串
# 我正在学习 python 的正则表达式,您能提炼出 python 关键字吗?

re.compile 返回一个正则对象,然后用这个正则对象,调用search

通过正则对象.search 的方式也是可以返回正则表达式的结果

# 导入正则表达式需要的re模块
import re
# 定义一个正则对象调用
pat = re.compile("python")  # 匹配python字符串
res = pat.search("我正在学习 python 的正则表达式,您能提炼出 python 关键字吗?")
print(res.group())
# 输出结果: python

正则表达式()括号的用法

通俗来讲,如果()括号里面的正则表达式与字符串内容匹配,那么提炼出来的数据将是()括号里面的匹配的数据

这个更深入理解,请点击 正则表达式-捕获组

例如:

我想通过正则表达式提炼出数字编号,分析为: 数字是元字符 \d ,最少需要一个数字,那就加一个元字符的限定条件+,现在期望提炼出数字那就用一对()括号进行包裹

最后得到提炼数字的正则表达式为:(\d+)

# 导入正则表达式需要的re模块
import re
content = '我的编号是 1234567 您能提炼编号吗?'
result = re.search('.*?(\d+).*?', content)
print(result)
# <re.Match object; span=(0, 13), match='我的编号是 1234567'>
print(result.group(1))
# 1234567

正则表达式实战代码演练

re.search 提炼class="active"的li,下面的歌手和歌曲名称

import re

html = '''<div id="songs-list">
    <h2 class="title">经典老歌</h2>
    <p class="introduction">
        经典老歌列表
    </p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君"><i class="fa fa-user"></i>但愿人长久</a>
        </li>
    </ul>
</div>'''
result = re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>', html, re.S)
if result:
    print(result.group(1), result.group(2))
#打印的结果: 齐秦 往事随风

例a: 使用re.S的 re.search 使用正则表达式 提炼 歌手和歌曲名称

# 导入正则表达式需要的re模块
import re

html = '''<div id="songs-list">
    <h2 class="title">经典老歌</h2>
    <p class="introduction">
        经典老歌列表
    </p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君">但愿人长久</a>
        </li>
    </ul>
</div>'''
result = re.search('<li.*?singer="(.*?)">(.*?)</a>', html, re.S)
if result:
    print(result.group(1), result.group(2))
# 任贤齐 沧海一声笑

例b:  没有re.S的 re.search 使用正则表达式 提炼 歌手和歌曲名称

# 导入正则表达式需要的re模块
import re
html = '''<div id="songs-list">
    <h2 class="title">经典老歌</h2>
    <p class="introduction">
        经典老歌列表
    </p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君">但愿人长久</a>
        </li>
    </ul>
</div>'''
result = re.search('<li.*?singer="(.*?)">(.*?)</a>', html)
if result:
    print(result.group(1), result.group(2))
# beyond 光辉岁月

我们发现例a的结果是:任贤齐 沧海一声笑,例b的结果是:beyond 光辉岁月,为什么结果不一样呢?

re.S 使 . 匹配包括换行在内的所有字符 li的html标签中有换行 包裹着 任贤齐 沧海一声笑 所以能匹配出来。而没有设置re.S将不能匹配出换行。

re.search(pattern, string, flags=0)

主要是第3个参数 flags 设置为 re.S,和 flags 没有设置的原因造成的。

第3个参数,也叫正则表达式修饰符,更多更深入的请点击 正则表达式修饰符

正则表达式修饰符 - 可选标志

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解