0x1、简介与亿点点学习经验
正则表达式
(Regular Expression) → 一门 为了字符串模式匹配,从而实现搜索和替换功能 的工具。
简单点说:
- 诉求:查找或替换字符串中满足 条件 的子串;
- 正则表达式:用来 描述这个条件 的工具;
Talk is cheap,平时老说正则表达式,字符串匹配的神器,到底有多神,写个简单例子体验下~
有下面这样一串字符串,让你查找当中所有的数字,你会怎么做?
sdfk似懂123非懂就35了框架89路径考669虑看路径
不用正则的话,一种常见的简单思路:遍历每个字符,执行判断,数字拼接,非数字跳过,代码示例如下:
sentence = "sdfk似懂123非懂就35了框架89路径考669虑看路径" number_dict = {} # 键为数字字符串、值为下标 temp_str = "" for index, character in enumerate(sentence): # 判断是否为数字,是追加 if character.isnumeric(): temp_str += character else: if len(temp_str) > 0: number_dict[temp_str] = index temp_str = "" continue print(number_dict) # 运行输出结果如下: {'123': 9, '35': 14, '89': 19, '669': 25}
而使用正则,只需写一个匹配表达式 \d+
,即可实现同样的匹配结果,代码示例如下:
import re sentence = "sdfk似懂123非懂就35了框架89路径考669虑看路径" results = re.finditer(r'\d+', sentence) if results is not None: for result in results: print(result) # 运行输出结果如下: <re.Match object; span=(6, 9), match='123'> <re.Match object; span=(12, 14), match='35'> <re.Match object; span=(17, 19), match='89'> <re.Match object; span=(22, 25), match='669'>
不要简单太多,此时再来需求说,字母也要匹配,遍历的方法还要去改循环逻辑,而正则直接改表达式即可~
Tips:写起来是爽,但性能可能没有遍历的方式好,下面说到正则的性能问题就知道了~
开始讲解正则的具体语法前,share一波自己学正则表达式的心得,毕竟自己也是从害怕它过来的~
- ① 不要有畏难情绪,越怕越学不会,都是死知识的组合而已,远没有算法难!
- ② 降低预期,不要上来就想着写出那种 贼牛逼的正则表达式,先写出 能用就好 的正则,后面再慢慢优化,大佬的正则也是经过大量尝试推演出来的;
- ③ 反复练习,看懂语法谁不会,得去练,加深印象,没机会练习的话,就自己找,安利两个练手方向:
方向一:查找满足条件的网页结点或文本
直接Chrome浏览器,F12打开开发者工具 → 切换到Source选项卡 → Ctrl + Shift + F,输入正则表达式,如:
方向二:推敲网上常用的正则表达式模板
分析下别人为什么那样写,弄点测试样本,自己试着写出来,多写几遍。
不要 不放过每个可以锻炼自己写正则的机会
,只看不练,过不了几天,你的正则姿势就都还给杰哥了,另外,安利一个 可视化正则表达式 的神器:regexper
另外,临时的正则校验工具,直接搜索引擎搜关键 在线正则表达式
,网上一堆。
万事具备,开始讲解正则具体的语法姿势了,冲!!!
0x2、基础语法
完整的正则表达式由两种字符构成:
普通字符
;特殊字符(元字符)
→ 表示特殊语义的字符,正则表达式功能的最小单位,如 *** ^ $ \d** 等;
① 最简单的匹配
没有特殊语义,普通字符一一对应,比如想在"Hello Python"字符串中查找"tho",直接用 'tho' 这个正则就好;
② 如何匹配特殊字符?
正则中的点 .
是特殊字符,用于匹配任意一个字符(除\n外),如果想把它当成普通字符串对待,即匹配一个点,需要用到 转义字符 → 反斜杠\
。放在特殊字符前,让其失去原本的特殊语义,比如:\.
就变成单纯地匹配点(.)了;
罗列一波 特殊字符元字符:
.
→ 匹配任意一个字符 (除换行符\n除外)\d
→ 匹配数字,0-9;\D
→ 匹配非数字;\s
→ 匹配空白,即空白符和tab缩进;\S
→ 匹配非空白;\w
→ 匹配字母、数字或下划线:a-z、A-Z、0-9、_;\W
→ 匹配非字母、数字或下划线;\x
→ 匹配十六进制数字;\O
→ 匹配八进制数字;\n
→ 匹配换行符;\r
→ 匹配回车符;\v
→ 匹配垂直制表符;\t
→ 匹配制表符;\f
→ 匹配换页符;[\b]
→ 匹配退格字符,加[]是为了和\b区分;