一、前言

为什么要学re库呢?这里主要学他的正则表达,在编写安全脚本的时候肯定要遇到一些不规则的匹配规则,当然编写爬虫也少不了正则匹配去找到一些具有特殊特征的字符串。因此这是十分必要的,然而。re库使 Python 语言拥有全部的正则表达式功能。我会先介绍一些常见的函数的功能并且举例。后再举例说明。一些常见的情况。当然除了掌握函数的功能,这只是基础,重点是自己会构造pattern。

这里介绍的匹配通俗来讲就是在一段字符串里面找某段字符串(pattern),在re库里面就有re.match()和re.search()等一些函数来找。

一定要会使用编译函数comlie(),find_all(),还有会正则表达格式。

二、re.match()

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。

  1. 规则是
  2. re.match(pattern,string,flag)

举例说明:

  1. import re
  2. print(re.match('www','www.baidu.com'))
  3. print(re.match('www','www.baidu.com').span())
  4. print(re.match('www','ewwww'))
  5. #输出
  6. <re.Match object; span=(0, 3), match='www'> #匹配成功返回一个对象
  7. 0,3 #只要起始位置到结束
  8. None #起始位置不匹配。返回空

这里就要提到另外一个知识点,我们知道,re.match返回的是一个obj,其中里面包含了span也就是位置,那我要返回匹配到的字符呢?为什么要返回匹配到的字符呢?因为这里的pattern到后面我们是自己设置的一些模式化的字符,比如我们要在一个js文件里面找出url,那么我们就要编写pattern模式,然后返回这个匹配到的模式字符。

所有这里引出来group()

group()

当使用正则表达式匹配时,通常会定义一个模式,该模式中包含一个或多个用括号括起来的子表达式,这些子表达式被称为"捕获组"。这些捕获组用于从匹配的文本中提取特定部分。例如,考虑以下示例:

  1. import re
  2. text = "My phone number is 123-456-7890."
  3. # 匹配电话号码的模式,使用捕获组提取区号、中间号和最后四位数字
  4. pattern = r'(\d{3})-(\d{3})-(\d{4})'
  5. match = re.search(pattern, text)
  6. if match:
  7. full_match = match.group(0) # 整个匹配
  8. area_code = match.group(1) # 第一个捕获组
  9. middle_digits = match.group(2) # 第二个捕获组
  10. last_digits = match.group(3) # 第三个捕获组
  11. print("Full Match: ", full_match)
  12. print("Area Code: ", area_code)
  13. print("Middle Digits: ", middle_digits)
  14. print("Last Digits: ", last_digits)
  15. else:
  16. print("No match.")
  17. #结果
  18. Full Match: 123-456-7890
  19. Area Code: 123
  20. Middle Digits: 456
  21. Last Digits: 7890

通俗解释就是:在pattern = r'(\d{3})-(\d{3})-(\d{4})'模式中,有三个捕获组,当匹配到的时候就可以使用group()返回整个匹配到的内容。使用group(1)就可以返回第一个捕获组。

如果要不区分大小写,就把flag设置为 re.M|re.I

例如

  1. re.search(pattern, textre.M|re.I)

三、re.search()

OK!到这里基本上已经了解到什么是匹配什么是模式,怎么返回匹配到的内容或者位置。现在引入另外一个常见的就是search

通常我们使用的都是这个去匹配而不是使用match;

  1. 使用规则
  2. re.search(pattern,string,flag)
  3. match的区别在于,search是从整个string中查找到pattern,然后返回obj,否则返回none。而match是只从开始找,如果一开始就不匹配那就返回none
  4. import re
  5. pattern = 'ww'
  6. string = 'aww'
  7. string2 = 'wwsdgsdww'
  8. match = re.search(pattern,string)
  9. match2 = re.search(pattern,string2)
  10. print(match)
  11. print(match2)
  12. print(match.group())
  13. #输出
  14. <re.Match object; span=(1, 3), match='ww'>
  15. <re.Match object; span=(0, 2), match='ww'>
  16. ww

四、替换函数re.sub()

  1. re.sub(pattern, repl, string, count=0, flags=0)
  2. 参数:
  3. - pattern : 正则中的模式字符串。
  4. - repl : 替换的字符串,也可为一个函数。
  5. - string : 要被查找替换的原始字符串。
  6. - count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

举例:

  1. import re
  2. pattern = 'ww'
  3. string2 = 'wwsdgsdww'
  4. replace = re.sub(pattern,"okok",string2)
  5. print(replace)
  6. #结果
  7. okoksdgsdokok

五、编译函数compile()

主要作用就是编译,什么意思?就是将pattern进行编译,在不编译pattern之前,我们是直接把pattern放进函数里面的,那样他会自己编译,但是当我们编译了之后就不用直接调用了。

举例:

  1. import re
  2. pattern = 'ww'
  3. string2 = 'wwsdgsdww'
  4. replace = re.search(pattern,string2)
  5. print(replace)
  6. #使用编译
  7. pattern = re.compile(pattern)
  8. replace = pattern.search(string2)
  9. print(replace)
  10. #输出
  11. <re.Match object; span=(0, 2), match='ww'>
  12. <re.Match object; span=(0, 2), match='ww'>

六、查找函数find_all(),finditer()

与search的区别在于它找到的是多个,返回的是一个列表。

规则:

  1. findall(string[, pos[, endpos]])
  2. 比如:
  3. findall(string,0,10)

举例

  1. import re
  2. pattern = 'ww'
  3. string2 = 'wwsdgsdww'
  4. pattern = re.compile(pattern)
  5. result = pattern.findall(string2)
  6. print(result)
  7. #输出
  8. ['ww', 'ww']

finditer和find_all一样。只不过finditer返回的是迭代,而不是列表。需要使用for循环print出来。

七、正则表达式

这里很重要,但是知识点又很多,所以看懂就行,建议当要设置匹配某个字符的特征表达式的时候,集合chatgpt来写。

模式 描述
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。
re 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。
re 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b 匹配a或b
(re) 对正则表达式分组并记住匹配的文本
(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re) 类似 (...), 但是不表示一个组
(?imx: re) 在括号中使用i, m, 或 x 可选标志
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志
(?#...) 注释.
(?= re) 前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re) 匹配的独立模式,省去回溯。
\w 匹配字母数字及下划线
\W 匹配非字母数字及下划线
\s 匹配任意空白字符,等价于 [ \t\n\r\f]
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9].
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z 匹配字符串结束
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等. 匹配一个换行符。匹配一个制表符。等
\1...\9 匹配第n个分组的内容。
\10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

举例:

在前端的代码中找出url:

  1. import requests,re
  2. # url = "https://ruan0423.github.io/"
  3. url = 'https://www.baidu.com'
  4. js_tewxt = requests.get(url).text
  5. # print(js_tewxt)
  6. pattern_raw = r"""
  7. (?:"|') # Start newline delimiter
  8. (
  9. ((?:[a-zA-Z]{1,10}://|//) # Match a scheme [a-Z]*1-10 or //
  10. [^"'/]{1,}\. # Match a domainname (any character + dot)
  11. [a-zA-Z]{2,}[^"']{0,}) # The domainextension and/or path
  12. |
  13. ((?:/|\.\./|\./) # Start with /,../,./
  14. [^"'><,;| *()(%%$^/\\\[\]] # Next character can't be...
  15. [^"'><,;|()]{1,}) # Rest of the characters can't be
  16. |
  17. ([a-zA-Z0-9_\-/]{1,}/ # Relative endpoint with /
  18. [a-zA-Z0-9_\-/]{1,} # Resource name
  19. \.(?:[a-zA-Z]{1,4}|action) # Rest + extension (length 1-4 or action)
  20. (?:[\?|/][^"|']{0,}|)) # ? mark with parameters
  21. |
  22. ([a-zA-Z0-9_\-]{1,} # filename
  23. \.(?:php|asp|aspx|jsp|json|
  24. action|html|js|txt|xml) # . + extension
  25. (?:\?[^"|']{0,}|)) # ? mark with parameters
  26. )
  27. (?:"|') # End newline delimiter
  28. """
  29. pattern_raw = re.compile(pattern_raw,re.VERBOSE)
  30. result = pattern_raw.finditer(str(js_tewxt))
  31. # print(result)
  32. for i in result:
  33. print(i.group())

结果

  1. "http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='

python之re库,正则表达的更多相关文章

  1. python——re模块(正则表达)

    python——re模块(正则表达) 两个比较不错的正则帖子: http://blog.csdn.net/riba2534/article/details/54288552 http://blog.c ...

  2. Python之面向对象和正则表达(代数运算和自动更正)

    面向对象 一.概念解释 面对对象编程(OOP:object oriented programming):是一种程序设计范型,同时也是一种程序开发的方法,实现OOP的程序希望能够在程序中包含各种独立而又 ...

  3. python关于类和正则表达( 编写一个程序(类))

    1.什么是类对象,实例对象 类对象:类名实例对象:类创建的对象 2.类属性: 就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本.对于公有的类属性,在类外可以通过类对象和实 ...

  4. 【python】re库 正则的一些过滤和把str拆分成list案例 以及json dict类型

    0x01: 部分参考:https://www.cnblogs.com/edwardsun/p/4421773.html match(string[, pos[, endpos]]) | re.matc ...

  5. python 正则表达提取方法 (提取不来的信息print不出来 加个输出type 再print信息即可)

    1,正则表达提取 (findall函数提取) import re a= "<div class='content'>你大爷</div>"x=re.finda ...

  6. Python的正则表达概述

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...

  7. 【python】标准库的大致认识

    正如那句 Python 社区中很有名的话所说的:“battery included”,Python 的一大好处在于它有一套很有用的标准库(standard library).标准库是随着 Python ...

  8. Python的常用库

    读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Kenneth Reitz写的最富盛名的http库.每个Python程序员都 ...

  9. 正则表达示 for Python3

    前情提要 从大量的文字内容中找到自己想要的东西,正则似乎是最好的方法.也是写爬虫不可缺少的技能.所以,别墨迹了赶紧好好学吧! 教程来自http://www.runoob.com/python3/pyt ...

  10. python 各种开源库

    测试开发 来源:https://www.jianshu.com/p/ea6f7fb69501 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. 链接 sel ...

随机推荐

  1. VSCode如何设置Vue前端的debug调试

    vscode在调试vue.代码时,如何进行debug? 1.安装Chrome Debug插件. 2.在launch.json中,将url修改成你前端项目的路径: 1 { 2 // Use Intell ...

  2. UE MultiLineTraceByChannel函数返回只有一个对象的问题

    问题描述 MultiLineTraceByChannel,看函数名字是返回射线检测到的所有对象,实际使用过程中,发现返回的数组中只又一个对象. Multi Line Trace by Channel ...

  3. Pycharm中开发vue element项目时eslint的安装和使用

    在PyCharm中使用ESLint对Element UI进行语法检查和代码风格检查的配置步骤如下: 确保你的项目已经配置了ESLint并且可以正常运行.如果尚未安装ESLint,请先使用npm(或者你 ...

  4. Django中的函数make_password、set_password和check_password

    在Django中,有一些用于处理密码的常用函数,包括make_password.set_password和check_password.这些函数用于生成.设置和验证密码,但没有直接的get_passw ...

  5. [oeasy]python0132_变量含义_meaning_声明_declaration_赋值_assignment

    变量定义 回忆上次内容 上次回顾了一下历史 python 是如何从无到有的 看到 Guido 长期的坚持和努力   编程语言的基础都是变量声明 python是如何声明变量的呢?   变量 想要定义变量 ...

  6. 手把手教你本地运行Meta最新大模型:Llama3.1,可是它说自己是ChatGPT?

    就在昨晚,Meta发布了可以与OpenAI掰手腕的最新开源大模型:Llama 3.1. 该模型共有三个版本: 8B 70B 405B 对于这次发布,Meta已经在超过150个涵盖广泛语言范围的基准数据 ...

  7. “智能体风”吹进体育圈 粉丝手搓上百个智能体为中国健儿应援 太有AI了!粉丝手搓上百个智能体为中国健儿打CALL

    智能体的风吹进了体育竞技圈.近日,在百度文心智能体平台,出现了上百个充满"AI"的运动明星粉丝应援智能体,比如支持中国女子乒乓球运动员孙颖莎的"孙颖莎的小迷妹" ...

  8. 18B20的CRC8校验分析

    CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定. CRC校验可以简单地描述为:例如我们要 ...

  9. hadoop web界面

    通过界面监控大数据平台运行状态 通过界面查看大数据平台状态 通过大数据平台 Hadoop 的用户界面可以查看平台的计算资源和存储资源.打开 http://master:8088/cluster/nod ...

  10. 前端使用 Konva 实现可视化设计器(19)- 连接线 - 直线、折线

    本章响应小伙伴的反馈,除了算法自动画连接线(仍需优化完善),实现了可以手动绘制直线.折线连接线功能. 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ ...