一、学习正则的目的

应用场景举例:

① 提取xml文件里的信息

有些xml文件应用编辑器的一些读取库可能无法实现效果,但是用正则的话基本上能解决绝大多数参数匹配问题。如以下提取头条等app的user_id

则可用以下方式解决

"""user_id"" value=""(%d+)"" />"

② 提取页面里的信息

re.findall("<span class="th3" value=".*?">(.*?)</span>")

③ 提取短信验证码

【今日头条】验证码1234,用于手机验证码登录,5分钟内有效。验证码提供给他人可能导致帐号被盗,请勿泄露,谨防被骗。

%d%d%d%d

还有各式各样的应用场景,所以学会正则,打好正则的基础对新手来说非常非常非常重要。

二、正则的使用详解(以python为例,其他语言都类似)

正则的语法: 使用元字符进行排列组合用来匹配字符串  在线测试正则表达式https://tool.oschina.net/regex/

元字符: 具有固定含义的特殊符号 
常用元字符:
 .     匹配除换行符以外的任意字符
 \w   匹配字母或数字或下划线 等同于[a-zA-Z0-9_]
 \s    匹配任意的空白符(几乎不用)
 \d    匹配数字 等同于[0-9]
 \n    匹配一个换行符 
 \t     匹配一个制表符
 
 ^     匹配字符串的开始
 $     匹配字符串的结尾
 
 \W    匹配非字母或数字或下划线 等同于[^a-zA-Z0-9_]
 \D    匹配非数字 [^0-9]
 \S    匹配非空白符
 a|b   匹配字符a或字符b
 ()    √匹配括号内的表达式,也表示一个组
 [...]    √匹配字符组中的字符
 [^...]    匹配除了字符组中字符的所有字符

量词: 控制前面的元字符出现的次数
 *    重复零次或更多次
 +    重复一次或更多次
 ?    重复零次或一次
 {n}    重复n次 
 {n,}    重复n次或更多次 
 {n,m}    重复n到m次

贪婪匹配和惰性匹配(重点)

 .*     贪婪匹配,  尽可能多的去匹配结果.*?    惰性匹配,  尽可能少的去匹配结果 -> 回溯str: 玩儿吃鸡游戏, 晚上一起上游戏, 干嘛呢? 打游戏啊reg: 玩儿.*?游戏此时匹配的是: 玩儿吃鸡游戏reg: 玩儿.*游戏   此时匹配的是: 玩儿吃鸡游戏, 晚上一起上游戏, 干嘛呢? 打游戏    找到了玩儿,往后走,"游戏"这个词还有很多个用(.*?)匹配的是一个,用(.*)找到的是最后一个 str: <div>胡辣汤</div>reg: <.*>结果: <div>胡辣汤</div>str: <div>胡辣汤</div>reg: <.*?>结果: <div></div>str: <div class="abc"><div>胡辣汤</div><div>饭团</div></div>reg: <div>.*?</div>结果:<div>胡辣汤</div><div>饭团</div>

所以我们能发现这样一个规律: .\*? 表示尽可能少的匹配, .\*表示尽可能多的匹配, 暂时先记住这个规律.

三、组合使用

1. 元字符+量词

匹配数字:\d+ 即代表 \d\d\d\d\d(无限个\d)

100000匹配结果为100000

匹配数字:\d? 即代表\d但匹配单一结果即

100000匹配结果为1 0 0 0 0 0

匹配数字:\d{4} 即代表\d多少次,超过了不要

100000匹配结果为1000

2. 原子表

[a]  匹配字母a

[ab] 匹配a或b

[abc] 匹配a或b或c

[a1] 匹配a或1

[a-z] 匹配任意一位小写字母

[A-Z] 匹配任意一位大写字母

[0-9] 匹配任意一个数字

[a-zA-Z] 匹配任意一个字母

[a-zA-Z0-9] 匹配任意一个数字或字母

[a][b] 匹配字母ab

[a][bc] 匹配字母ab或ac 等同于(ab)|(ac)

[a-z]{m} 匹配m个小写字母

[0-9]{m} 匹配m个数字

匹配手机号码
第一位  第二位   第三位之后1      3-9     0-9 [1][3-9][0-9]{9}

[a-z]{m,n}  匹配m-n位的小写字母

[a-z]{m,} 至少m位小写字母

四、re模块使用

1. findall 查找所有. 返回list

   lst = re.findall("m", "mai le fo len, mai ni mei!") print(lst)    # ['m', 'm', 'm'] lst = re.findall(r"\d+", "5点之前. 你要给我5000万")print(lst)   # ['5', '5000']

2. search 会进行匹配. 但是如果匹配到了第一个结果. 就会返回这个结果. 如果匹配不上search返回的则是None

   ret = re.search(r'\d', '5点之前. 你要给我5000万').group()print(ret) # 5

3. match  只能从字符串的开头进行匹配(再见)

   ret = re.match('a', 'abc').group()  print(ret)     # a

4. finditer 和findall差不多. 只不过这时返回的是迭代器(重点)

   it = re.finditer("m", "mai le fo len, mai ni mei!")for el in it:print(el.group()) # 依然需要分组


5. compile()  可以将一个长长的正则进行预加载. 方便后面的使用

   obj = re.compile(r'\d{3}')  # 将正则表达式编译成为一个 正则表达式对象, 规则要匹配的是3个数字ret = obj.search('abc123eeee') # 正则表达式对象调用search, 参数为待匹配的字符串print(ret.group())  # 结果: 123

6. 正则中的内容如何单独提取?

单独获取到正则中的具体内容可以给分组起名字

   s = """<div class='西游记'><span id='10010'>中国联通</span></div>"""obj = re.compile(r"<span id='(?P<id>\d+)'>(?P<name>\w+)</span>", re.S)result = obj.search(s)print(result.group())  # 结果: <span id='10010'>中国联通</span>print(result.group("id"))  # 结果: 10010 # 获取id组的内容print(result.group("name"))  # 结果: 中国联通 # 获取name组的内容

这里可以看到我们可以通过使用分组. 来对正则匹配到的内容进一步的进行筛选.

7. 正则表达式本身是用来提取字符串中的内容的. 也可以用作字符串的替换

   import rer = re.split(r"\d+", "我今年19岁了, 你知道么, 19岁就已经很大了. 周杰伦20岁就得奖了")print(r)  # ['我今年', '岁了, 你知道么, ', '岁就已经很大了. 周杰伦', '岁就得奖了']# 替换r = re.sub(r"\d+", "18", "我今年19岁了, 你知道么, 19岁就已经很大了. 周杰伦20岁就得奖了")print(r)  # 我今年18岁了, 你知道么, 18岁就已经很大了. 周杰伦18岁就得奖了

以上大概就是爬虫/逆向/协议上用到正则的一些情况,同时也借助了一些课程的讲解方便理解,如果有在学习python遇到相关的问题也欢迎沟通交流,如果有兴趣作者可以提供共享一些直播课程给各位。

Python 学习 正则re解析详解相关推荐

  1. python编辑距离正则匹配_详解一道腾讯面试题:编辑距离

    原标题:详解一道腾讯面试题:编辑距离 来自公众号:labuladong 预计阅读时间:8 分钟 前几天在网上看到一份鹅场的面试题,算法部分大半是动态规划,最后一题就是写一个计算编辑距离的函数,今天就专 ...

  2. Python学习笔记:Import详解2

    目录 目录 一 module 二 package 一模块 一 module 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".&qu ...

  3. python学习:break用法详解

    在执行while循环或者for循环时,只要循环条件满足,程序会一直执行循环体.但在某些场景,我们希望在循环结束前就强制结束循环. Python中有两种强制结束循环的方法: 1.continue语句:跳 ...

  4. Python基础学习之 os 模块详解

    Python基础学习之 os 模块详解 文章目录 Python基础学习之 os 模块详解 1. 路径操作 1.1 os.chdir(),切换当前工作目录: 1.2 os.getcwd(),返回工作目录 ...

  5. 【强化学习】Sarsa算法详解以及用于二维空间探索【Python实现】

    Sarsa算法 Sarsa算法,是基于Q-Learning算法.改动其实很小. 本文工作基于之前的Q-Learning的项目,如果有疑问可以看下面两个问题: [强化学习]Q-Learning算法详解以 ...

  6. 大白话解析Apriori算法python实现(含源代码详解)

    大白话解析Apriori算法python实现(含源代码详解) 一.专业名词解释 二.算法思路 三.python代码实现 四.Aprioir的优点.缺点及改进方法 本文为博主原创文章,转载请注明出处,并 ...

  7. python语言入门详解-python初级教程:入门详解

    python初级教程:入门详解 Crifan Li 目录 前言 .................................................................... ...

  8. ELK学习笔记之Logstash详解

    0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...

  9. python编程入门与案例详解-quot;Python小屋”免费资源汇总(截至2018年11月28日)...

    原标题:"Python小屋"免费资源汇总(截至2018年11月28日) 为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29 ...

最新文章

  1. Android中Intent传值
  2. 一个老工程师对理工科学生的忠告
  3. 从0到1演示用 Git Rerere 自动解决冲突
  4. 微软Azure CDN现已普遍可用
  5. 如何打开Tango的ADF文件?
  6. ORA-00980与PL/SQL程序编译出错
  7. C语言与JAVA内存管理_C语言内存管理
  8. 手机音频拼接软件_良心分享:业界最顶尖的软件!
  9. 机器学习_决策树_ID3算法_C4.5算法_CART算法及各个算法Python实现
  10. java 新建 api 案列_Java利用webservice创建接口案例源码
  11. ES6学习笔记(三)—— Set 和 Map
  12. OpenShift Security (10) - 用红帽高级集安全产品监控容器中运行的安全违规操作
  13. Win10下python不同版本同时安装并解决pip共存问题
  14. Visual Basic的调试和错误处理
  15. android10设置led指示灯,Android8.0在Setting中添加Led指示灯闪烁开关
  16. edittext 点击区域外隐藏输入法
  17. html+上下标+遇乘号无效,html中的特殊符号
  18. 股市底部上证指数与物价上涨的关系01
  19. SPSS详细操作:生存资料的Cox回归分析
  20. ERROR: Cannot uninstall ‘PyYAML’. It is a distutils installed project and thus we cannot accurately

热门文章

  1. 转载:软件开发技术常用术语英中对照
  2. 观看慕课moocer老师视频Spring Bean装配之Autowire注解说明-7
  3. 刘东戈教授|追本溯源—2B3D是CSCO推荐具有重要意义的MSI检测位点
  4. c语言 文档存储,C语言数据的存储
  5. 如何识别图片验证码?
  6. 深入解析Windows操作系统之总体架构
  7. php-初体验,Apache初次配置PHP基本语法
  8. 神州信息笔试 2020年9月28日
  9. PMBOK第六版-中文版和知识点解析(加细分图解PPT)
  10. JS报未结束字符串常量错误