python小知识-正则表达

简介: 正则表达式是一种匹配字符串的规则,我们可以通过正则表达式去搜索指定规则的字符串

正则表达式是一种匹配字符串的规则,我们可以通过正则表达式去搜索指定规则的字符串。

如果你有需要匹配字符串,正则是一种选择,特别是匹配规则比较复杂的情况下。正则表达式最常用的地方是爬虫,在爬取网页时,指定你需要爬取的内容。

python中的模块re提供了解析正则匹配的规则。

因为正则规则比较不容易理解,理解了规则也会很快忘记,所以建议是了解常用的使用,有具体的匹配需求再去了解是否有规则可以满足你的要求。

1. 正则的四种规则

所以我们先通过一个简单的例子来了解下re正则匹配

import re
pattern = "\w+"
ret = re.match(pattern, "a12323abc")
print(ret)
# <_sre.SRE_Match object; span=(0, 9), match='a12323abc'>

正则规则可以分四种:

    1. 单个字符, 如上面例子中\w表示普通字符(数字、字母或下划线);其他如下:

    yyq-2023-02-17-22-51-31.png

    1. 数量, 如上面例子中+表示重复一次或者多次, ?表示重复0次或者一次

    yyq-2023-02-17-22-52-51.png

    1. 字符组,就是一组字符,用[]包含起来,如果在一个字符组里枚举所有字符,字符组里的任意一个字符和"待匹配字符"相同都视为可以匹配

    yyq-2023-02-17-23-00-12.png

    1. 位置: ^表示匹配开头,$表示匹配结尾

上面例子中"\w+"表示只要是一个或者多个普通字符都算匹配,如何匹配re.match返回非None,否则返回None

我们在看一个匹配邮箱的里子


# @前面是一个或者多个字符,@后面是一个或者多个字符, 接着最后.com
pattern = "\w+@\w+\.com"
ret = re.match(pattern, "yuyq@163.com")
print(ret)
# <_sre.SRE_Match object; span=(0, 12), match='yuyq@163.com'>

pattern = "\w+@\w+\.com"
ret = re.match(pattern, "yuyqx163.com")
print(ret)
# None

pattern = "\w+@(\w+\.)?\w+\.com"
ret = re.match(pattern, "hello123@1xheuet..edu.com")
print(ret)
# None

从上面例子需要知道:

  • 由于.是正则里的特殊字符,需要转义\.
  • (\w+\.)? 中?表示0或者多个,也可以理解有也可以没有也可以,()表示包括的字符是一起的,也就是说 abc.ax. 类似这种是匹配的。上面最后一个例子中多个一个.不符合规则

2. match和search的区别

re除了提供match,还提供search,findall,sub,split等函数;其中match和search,findall提供搜索匹配,sub提供替换,split提供分割。

那match和search有什么区别?

pattern = "(acb)+"
ret = re.match(pattern, "dacbbacb1b")
print(ret)
# None

ret = re.search(pattern, "dacbbacb1b")
print(ret)
# <_sre.SRE_Match object; span=(1, 4), match='acb'>

ret = re.findall(pattern, "dacbbacb1b")
print(ret)
# ['acb', 'acb']

上面的例子,待匹配的字符串中明明有acb为什么match没有匹配成功,原因是:

  • re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None
  • re.search匹配整个字符串,直到找到一个匹配
  • 而re.findall 是匹配所有

我们来看看sub和split的例子

import re
# ":| "表示用:或者空格匹配,|表示只要匹配其中一个规则就可以
ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret)
# ['info', 'xiaoZhang', '33', 'shandong']

import re
# 如果"python = 997"中的1个或者多个数字(/d)就是997,使用前面的xx替换
ret = re.sub(r"\d+", "xx", "python = 997")
print(ret)
# python = xx

3. 更多的例子

我们来看几个个复杂的例子

# 匹配1-100
pattern = "[1-9]?\d$|100"
ret = re.match(pattern, "102")
print(ret)
# None

规则解说:

  • [1-9]?表示0或者1个0到9的其中一个数字,
  • 然后\d$是以一个数字结尾;$表示结尾
  • |100也是匹配的
pattern = "[a-zA-Z0-9_]{8,20}"
ret = re.match(pattern, "000000000.")
print(ret)
# None

规则解说:

  • [a-zA-Z0-9_] 必须是大写字母,小写字母,数字和下划线例的字符
  • {8,20}:数量是8到20个

4. 正则的贪婪与⾮贪婪

正则还有一个匹配原则是最多匹配(贪婪)和最少匹配(⾮贪婪)

  • 正则表达式默认为贪婪匹配,也就是尽可能多的向后匹配字符,比如 {n,m} 表示匹配前面的内容出现 n 到 m 次(n 小于 m),在贪婪模式下,首先以匹配 m 次为目标
  • 而在非贪婪模式是尽可能少的向后匹配内容,也就是说匹配 n 次即可

贪婪模式转换为非贪婪模式的方法很简单,在元字符后添加?即可实现

pattern = "b+"
ret = re.match(pattern, "bbacb1b")
print(ret.group())
# bb

pattern = "b+?"
ret = re.match(pattern, "bbacb1b")
print(ret.group())
# b

从上面例子可以:

  • 默认是贪婪模式,匹配到最多;规则是一个或者多个b,有多少个b就有输出多少个b
  • 加?是非贪婪模式,规则是一个或者多个b,就匹配一个b
  • 通过group()输出匹配的字符串

5. 后记

正则规则通常很容易忘记,这里提供一个比较清晰的规则备忘,需要使用的可以查看

总之,记得有re正则这个字符匹配工具,遇到合适场景就可以亮出它。希望对你有帮助!

目录
相关文章
|
Java PHP C#
初识Python之正则表达篇(完结)
初识Python之正则表达篇(完结)
140 0
初识Python之正则表达篇(完结)
|
数据采集 数据可视化 Java
python基础—正则表达式即re模块!
正则表达式(regular expression),就是字符匹配模式,而这个匹配规则在我们写爬虫进行数据提取,或者进行数据可视化进行数据清洗时经常用到,多样化的匹配规则在复杂的字符的情况提取数据时助我们一臂之力;在Perl、java、C/C++等编程语言都支持;python是以re模块的形式支持的;
|
18天前
|
存储 数据挖掘 开发者
Python编程入门:从零到英雄
在这篇文章中,我们将一起踏上Python编程的奇幻之旅。无论你是编程新手,还是希望拓展技能的开发者,本教程都将为你提供一条清晰的道路,引导你从基础语法走向实际应用。通过精心设计的代码示例和练习,你将学会如何用Python解决实际问题,并准备好迎接更复杂的编程挑战。让我们一起探索这个强大的语言,开启你的编程生涯吧!
|
24天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
24天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
24天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
10天前
|
Python
Python编程入门:从零开始的代码旅程
本文是一篇针对Python编程初学者的入门指南,将介绍Python的基本语法、数据类型、控制结构以及函数等概念。文章旨在帮助读者快速掌握Python编程的基础知识,并能够编写简单的Python程序。通过本文的学习,读者将能够理解Python代码的基本结构和逻辑,为进一步深入学习打下坚实的基础。
|
15天前
|
数据采集 存储 数据处理
Python中的多线程编程及其在数据处理中的应用
本文深入探讨了Python中多线程编程的概念、原理和实现方法,并详细介绍了其在数据处理领域的应用。通过对比单线程与多线程的性能差异,展示了多线程编程在提升程序运行效率方面的显著优势。文章还提供了实际案例,帮助读者更好地理解和掌握多线程编程技术。