😝 这次一定 | "学废" 正则表达式 🙋‍♂️(上)

简介: 正则表达式 → 没有一个开发仔会对这个词陌生吧?没印象的话,想想你是如何 判断身份证、手机号码是否合法的 ?Tips:本节代码示例基于Python的re库编写,虽大部分编程语言的正则库都是师从 Perl语言,语法基本一样,但也可能略有差异~

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区分;


相关文章
|
算法 Python Perl
😝 这次一定 | "学废" 正则表达式 🙋‍♂️(下)
正则表达式 → 没有一个开发仔会对这个词陌生吧?没印象的话,想想你是如何 判断身份证、手机号码是否合法的 ?Tips:本节代码示例基于Python的re库编写,虽大部分编程语言的正则库都是师从 Perl语言,语法基本一样,但也可能略有差异~
193 0
|
搜索推荐 iOS开发 Python
😝 这次一定 | "学废" 正则表达式 🙋‍♂️(中)
正则表达式 → 没有一个开发仔会对这个词陌生吧?没印象的话,想想你是如何 判断身份证、手机号码是否合法的 ?Tips:本节代码示例基于Python的re库编写,虽大部分编程语言的正则库都是师从 Perl语言,语法基本一样,但也可能略有差异~
175 0
Python 内置正则表达式库re的使用
正则表达式是记录文本规则的代码,用于查找和处理符合特定规则的字符串。在Python中,常通过原生字符串`r&#39;string&#39;`表示。使用`re.compile()`创建正则对象,便于多次使用。匹配字符串有`match()`(从开头匹配)、`search()`(搜索首个匹配)和`findall()`(找所有匹配)。替换字符串用`sub()`,分割字符串则用`split()`。
|
6月前
|
数据库 Python
Python网络数据抓取(8):正则表达式
Python网络数据抓取(8):正则表达式
57 2
|
6月前
|
自然语言处理 JavaScript 前端开发
Python高级语法与正则表达式(二)
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
|
6月前
|
安全 算法 Python
Python高级语法与正则表达式(一)
Python提供了 with 语句的写法,既简单又安全。 文件操作的时候使用with语句可以自动调用关闭文件操作,即使出现异常也会自动关闭文件操作。
|
6月前
|
Python
Python使用正则表达式分割字符串
在Python中,你可以使用re模块的split()函数来根据正则表达式分割字符串。这个函数的工作原理类似于Python内置的str.split()方法,但它允许你使用正则表达式作为分隔符。
|
6月前
|
Python
Python中re模块的正则表达式
【6月更文挑战第2天】了解Python的re模块,它是处理正则表达式的核心工具。正则表达式用于在文本中查找特定模式。本文讨论了re模块的用法和技巧,包括导入模块、匹配、分组、替换文本、编译正则表达式以及使用预定义字符类、量词、锚点等高级功能。通过实例展示了如何在Python中执行这些操作,帮助提升文本处理能力。掌握这些技巧将使你更有效地利用正则表达式解决字符串处理问题。
59 2
|
6月前
|
Python
Python正则表达式详解:掌握文本匹配的魔法
Python正则表达式详解:掌握文本匹配的魔法
|
6月前
|
Python
python re 正则表达式库的使用
python re 正则表达式库的使用
44 0