Python 自动化办公实战课
尹会生
前游戏公司技术总监,前新浪网研发中心技术经理
21781 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 37 讲
Python 自动化办公实战课
15
15
1.0x
00:00/00:00
登录|注册

08|正则表达式:如何提高搜索内容的精确度?

元字符“$”
元字符“^”
元字符“.”
元字符“?”
元字符“*”
元字符“+”
元字符“{}”
元字符“[]”
参数flags
参数string
参数pattern
re.sub()函数
group()函数
模糊匹配
精确匹配
re.search()函数
思考题
提取和替换
两种匹配方式
整个搜索过程
正则表达式:如何提高搜索内容的精确度?

该思维导图由 AI 生成,仅供参考

你好,我是尹会生。
开始上课之前,我想先带你看两种常见的工作需求:
领导让你搜索出一个文档里所有的手机号码, 而你只知道手机号的模式是 11 位数字,那该怎样搜索呢?
你需要在一个文档中搜索一串带区号的电话号码,比如 010-12345678,099-1234567 ,不过在这个文档中,有很多组电话号码,它们的区号和电话号码长度都不同,你该怎么一次性把它们全部搜索出来呢?
其实,这两种场景具有一个共同点:就是你要一次搜索出所有的结果,且不能使用具体的数字,这该怎么办呢?答案是使用某种模式进行搜索。
就像搜索手机号,我可以使用 11 位数字这种模式。搜索电话号码我就可以用 3-4 个数字或 7-8 个数字加上“-”的模式。这就是利用模式匹配的方法把手机和电话号码从文档中找出来,提高文本搜索的效率。
对于模式匹配,使用 Python 的正则表达式是最便捷、也是最有效率的。这节课,我就来手把手教你用正则表达式来提高搜索效率。

使用正则表达式进行搜索的整个过程

首先,我先带你来看下使用正则表达式进行搜索的整个过程,利用正则表达式可以按照模式来匹配搜索结果,而且比自己编写函数搜索功能更加强大, 而且实现起来也更加简洁。
要实现搜索,我们就要用到 Python 的正则表达式库(叫做 re 库)中的 search() 函数,这是利用正则表达式实现搜索的核心函数。如果能够搜索到匹配模式的结果,就返回匹配字符串出现的文件的位置,以及匹配的字符串内容。接下来我们重点看一下它的参数。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何使用Python的re库和正则表达式来提高搜索内容的精确度。作者首先讲解了使用re.search()函数进行搜索的整个过程,以及re.search()函数的参数和使用方法。接着,文章分别介绍了精确匹配和模糊匹配两种匹配方式,详细解释了元字符“[]”、“{}”和“+”、“*”、“?”的使用方法。随后,文章提供了关于提取和替换搜索结果的方法,包括使用group()函数进行内容提取和使用sub()函数进行内容替换。最后,文章总结了搜索中的常见问题和对应的解决方案,并提出了思考题,引导读者思考如何使用re库的search()函数实现身份证的匹配和提取功能。通过本文,读者可以快速了解正则表达式的基本原理和在Python中的应用,以及如何利用正则表达式提高搜索的精确度和效率。文章内容丰富,技术性强,适合对正则表达式和Python搜索功能感兴趣的读者阅读。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 自动化办公实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • GoodLuck
    re.sub("(Y|y)(es)*", "No", "aayesbb") 'aaNobb' # 执行结果 中的那个*是不是应该改成?

    作者回复: 改成 ? 更贴切,我使用* 匹配了es多次,只使用了第一次

    2023-01-14归属地:江苏
  • 谢韬 Fragos
    根据尹老师的课程我总结了16个常用的正则表达式的元字符及组合的用法列子,供大家参考。 # 元字符* 表示从0到多个 p1=re.compile('ca*t') print(p1.match('ct')) print(p1.match('cat')) print(p1.match('caaat')) # 元字符+ 表示从1到多个 p2=re.compile('ca+t') print(p2.match('ct')) print(p2.match('cat')) print(p2.match('caaat')) # 元字符点. 用于匹配任意单个字符 p3= re.compile('...') print(p3.match('abc')) # 元字符^表示以什么字符开头 p4 = re.compile('^~') print(p4.match('~abcd')) # 元字符$ 表示以什么结尾,从后往前匹配 phone = '123-456-789 #这是电话号码' p5 = re.sub('#.*$','',phone) print(p5) # 元字符?表示前面到字符出现0次或1次 p6 = re.compile('ca?t') print(p6.match('ct')) print (p6.match('cat')) print (p6.match('caat')) # 元字符{} 大括号里面的数字表示前面字符出现多少次 p7 = re.compile('ca{3}t') print(p7.match('caaat')) #{m,n} 打括号表示前面字符出现m 到 n次(包括m和n)之间的次数 p8 = re.compile('ca{2,5}t') print(p8.match('caaaaat')) # 元字符[] 中括号表示括号里任意字符匹配成功就算匹配成功。 p9 = re.compile('c[a-d]t') print(p9.match('cat')) print(p9.match('cbt')) print(p9.match('cct')) print(p9.match('cdt')) # | 竖线表示的是字符选择左边还是右边。通常和括号用在一起 p10 = re.sub("(Y|y)(es)*","No","aayesbbcc") print(p10) # \d 斜杠d表示匹配的内容为一串数字 相当于[0-9]出现了多次([0-9]+) p11 = re.compile(r'\d+-\d+-\d+') print(p11.match('2022-3-15')) # \D斜杠D匹配不包含数字的字符 phone = '123-456-789 #这是电话号码' p12 = re.sub(r'\D','',phone) print(p12) # \s 匹配的是字符串 #元字符()小括号的作用是进行分组。作用强大。 p14 = re.compile(r'(\d+)-(\d+)-(\d+)') print(p14.match('2022-3-15').group(1)) print(p14.match('2022-3-15').groups()) year, month, day= p14.match('2022-3-15').groups() print(year) # 元字符^$ 表示这样一行为空行。 # 元字符.*? 表示不使用贪婪模式,只匹配第一个匹配上的内容。编写网页匹配很常用。 # 字符r(表示字符串是raw string)可以让转义符失效,原样输出 print (r'\n x \n')
    2022-03-15
    4
  • Bill
    [0-9]{18}
    2021-10-19
    1
  • ifelse
    学习打卡
    2023-07-07归属地:浙江
  • 坚果
    p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
    2022-02-28
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部