Python正则表达式详解:掌握文本匹配的魔法

简介: Python正则表达式详解:掌握文本匹配的魔法

模块

python 中使用正则模块 re,以下简单介绍一下模块0.0

概念

模块就是一个特殊的包,一个模块中存放很多个方法
一个模块类比成一个py文件
模块中的方法类比成py文件中的函数、类

分类

1.内置模块:python解释器封装好,能直接进行使用的模块
  keyword模块(获取python内置关键字)    re   os   time   random
2.自定义模块:程序员根据自己程序的需求编写模块
3.第三方模块:别人编写好的上传到服务器中的模块。如果想要使用需要下载安装

使用

1.第一种方式
  import 模块名
  模块名.方法名()
2. 第二种方式
  from 模块名 import 方法名
  方法名()

正则表达式

概念

正则用于从字符串中提取合规的子字符串使用、验证字符串是否合规

基础使用

re模块中match方法
import re
# match()
# 语法:re.match(r'正则表达式',进行校验或匹配的字符串)
# 作用:从字符串开头开始匹配,一旦匹配成功立马返回对象,匹配失败返回None;
# ret.group()   如果匹配成功则打印匹配成功的数据,匹配失败会报错
my_str = "激情激情速度与激情"
ret = re.match(r"激情",my_str)
print(ret.group())

元字符

import re
# 元字符:匹配单个的字符、一个字符
# \d:匹配数字0-9之间的任意一个
# \D:匹配除数字以外的任意一个字符
# \w:匹配数字、字母、下划线、中文中的任意一个字符
# \W:匹配除数字、字母、下划线、中文中的任意一个字符
# \s:匹配空白字符(空格、\n、\t……)
# \S:匹配非空白字符
# []:字符组、匹配字符组中的任意一个字符
# [5-8]:匹配数字5-8之间的任意一个字符
# [2-57-9]:匹配数字2-5、7-9之间的任意一个字符
# [c-fC-F]:匹配字母c-f之间的任意一个字符(不区分大小写)
# [0-9a-zA-Z]:匹配数字字母
# .:匹配除\n以外的任意一个字符
# ^:以……开头   (match方法本身要求从字符串开头开始匹配,所以对于match来说,写^与不写^没有区别)
# $:以……结尾   (一般使用match方法将^$加上)
my_str = "速度与激情1"
ret = re.match(r"^速度与激情\d$",my_str)
print(ret.group())

量词

量词:指定量词前的元字符要匹配的次数,量词一定要与元字符搭配使用,不能单独使用
import re
# 量词:指定量词前的元字符要匹配的次数,量词一定要与元字符搭配使用
# *:匹配0次或无数次
# +:匹配1次或无数次
# ?:匹配0次或1次
# {}:指定匹配的次数
# {n}:匹配量词前的元字符n次
# {m,n}:匹配量词前的元字符至少m次,最多n次
# {m,}:匹配量词前的元字符至少m次
# {,n}:匹配量词前的元字符最多n次
my_str = "速度与激情"
ret = re.match(r"^速度与激情\d{,3}$",my_str)
print(ret.group())

贪婪与非贪婪匹配

贪婪匹配:尽可能多的匹配字符,一般是+前匹配
非贪婪匹配:尽可能少的匹配字符,一般是?前匹配
# *:匹配0次或无数次     可有可无
# +:匹配1次或无数次     贪婪匹配
# ?:匹配0次或1次        非贪婪匹配

分组与或

from re import match
# 分组    ()
# 或      |
# 让用户输入自己的邮箱,正则验证邮箱是否合法
# 邮箱规则:@前由6-14位数字字母下划线组成,@后可以匹配多种邮箱 例如:139.com移动、163.com网易、sina.com新浪、qq.com腾讯
email = input("请输入你的邮箱:")
ret = match(r"^[0-9a-zA-Z_]{6,14}@(qq|163|139|sina)\.com$",email)
print(ret.group())

获取分组匹配成功的数据

from re import match
email = input("请输入你的邮箱:")
ret = match(r"^[0-9a-zA-Z_]{6,14}@(qq|163|139|sina)\.com$",email)
# 验证邮箱是否合规,如果合规则判断当前用户输入的邮箱属于哪个公司
# 如果正则匹配成功,ret返回一个对象;匹配失败则返回None
if ret:
    print("邮箱合法")
    # 判断是哪一个公司的邮箱-->根据正则中第一个分组匹配成功的数据进行判断
    # ret.group():获取具体匹配成功的整个数据
    # ret.group(1):获取正则中第一个分组具体匹配成功的数据
    name = ret.group(1)
    print(name)
    if name == "qq":
        print("腾讯邮箱")
    elif name == "163":
        print("网易邮箱")
    elif name == "139":
        print("移动邮箱")
    elif name == "sina":
        print("新浪邮箱")
else:
    print("邮箱不合规")

使用分组

正则案例-匹配标签名
from re import match
# 正则验证网页标签内容
# <标签名>内容</标签名>
# 内容规则:内容可以匹配任意类型数据   数量可有可无
# 标签名规则:
    # 1.第一个字符  小写字母    必须有  
    # 2.第二个字符  可以是小写字母,也可以是数字1-6    可有可无   有最多只能有1个
    # 3.从第三个字符开始  全由小写字母组成   可有可无    有可以有无数个    
# 例如:
# <a></a>
# <p></p>
# <h3></h3>
# <font></font>
# <marquee></marquee>
# 内容正则:.*
# 标签名正则: [a-z][a-z1-6]?[a-z]*
    # 1.[a-z]
    # 2.[a-z1-6]?
    # 3.[a-z]*
# 存在的问题:如果开始标签与结束标签不一致,也可以正常匹配成功?????
# 要求:开始标签和结束标签必须匹配一样的数据
# 实现:要求结束标签标签名(匹配规则、匹配数据)都要与开始标签一致
# 解决方法:让结束标签使用开始标签的分组
my_str = "<a>我是法外狂徒张三</h3>"
ret = match(r"^<[a-z][a-z1-6]?[a-z]*>.*</[a-z][a-z1-6]?[a-z]*>$",my_str)
print(ret.group())  # 匹配成功
使用分组方式一:
# 使用分组:
# 第一种方式:使用分组序号寻找分组
# 1. 将开始标签标签名组成一个分组    作为整个正则中的第一个分组     分组序号 1
# 2. 让结束标签使用开始标签的分组    \分组序号     \1
my_str = "<a>我是法外狂徒张三</a>"
ret = match(r"^<([a-z][a-z1-6]?[a-z]*)>.*</\1>$",my_str)
print(ret.group())
# 如果结束标签与开始标签不一致则报错
使用分组方式二:
# 使用分组:
# 第二种方式:使用分组名寻找分组
# 1. 将开始标签标签名组成一个分组     (正则表达式)
# 2. 给开始标签的分组起别名          (?P<别名>正则表达式)
# 3. 给结束标签的标签名设置分组      ()
# 3. 让结束标签使用开始标签的分组     (?P=别名)
my_str = "<a>我是法外狂徒张三</a>"
ret = match(r"^<(?P<aaa>[a-z][a-z1-6]?[a-z]*)>.*</(?P=aaa)>$",my_str)
print(ret.group())

常用方法

match

import re
my_str = "这个视频的播放量位459295,点赞量位74563,转发量位2458"
# 正则查询字符串中的数字
# 数字正则:\d+
# match()
# 语法:re.match(r"正则",字符串)
# 作用:从字符串开头开始匹配。一旦匹配成功立马返回对象,匹配失败返回None;
# ret.group()  如果匹配成功返回具体匹配成功的数据,匹配失败则报错
ret = re.match(r"\d+",my_str)
print(ret)
print(ret.group())

search

import re
my_str = "这个视频的播放量位4879615,点赞量位18485,转发量位254"
# 正则查询字符串中的数字
# 数字正则:\d+
# search()
# 语法:re.search(r"正则",字符串)
# 作用:从字符串任意位置开始匹配。一旦匹配成功立马返回对象,匹配失败返回None
# ret.group()  如果匹配成功返回具体匹配成功的数据,匹配失败则报错
ret = re.search(r"\d+",my_str)
print(ret.group())

findall

import re
my_str = "这个视频的播放量位4879615,点赞量位18485,转发量位254"
# 正则查询字符串中的数字
# 数字正则:\d+
# findall()
# 语法:re.findall(r"正则",字符串)
# 作用:以列表的形式返回字符串中所有符合规则的数据,如果没有匹配成功的数据则返回空列表
ret = re.findall(r"\d+",my_str)
print(ret)
相关文章
|
3天前
|
机器学习/深度学习 自然语言处理 TensorFlow
使用Python实现深度学习模型:语言模型与文本生成
使用Python实现深度学习模型:语言模型与文本生成
32 5
|
1天前
|
存储 语音技术 Python
文本 ---> 语音转换器(Python实现)
本项目是一个简单的从文本到语音这样一个转换器的图形用户界面应用,使用了`Python`的`tkinter`库来构建界面,以及`pyttsx3`库来执行转换。以下是对该项目代码的详细解释,后面会附上完整项目代码
6 0
文本 ---> 语音转换器(Python实现)
|
3天前
|
机器学习/深度学习 自然语言处理 数据挖掘
使用Python和大模型进行数据分析和文本生成
Python语言以其简洁和强大的特性,成为了数据科学、机器学习和人工智能开发的首选语言之一。随着大模型(Large Language Models, LLMs)如GPT-4的崛起,我们能够利用这些模型实现诸多复杂任务,从文本生成到智能对话、数据分析等等。在这篇文章中,我将介绍如何用Python连接和使用大模型,并通过示例展示如何在实际项目中应用这些技术。
|
5天前
|
数据采集 前端开发 JavaScript
python语言通过简单爬虫实例了解文本解析与读写
python|通过一个简单爬虫实例简单了解文本解析与读写
|
7天前
|
自然语言处理 JavaScript 前端开发
Python高级语法与正则表达式(二)
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
|
7天前
|
安全 算法 Python
Python高级语法与正则表达式(一)
Python提供了 with 语句的写法,既简单又安全。 文件操作的时候使用with语句可以自动调用关闭文件操作,即使出现异常也会自动关闭文件操作。
|
14天前
|
API 语音技术 Python
【python的魅力】:教你如何用几行代码实现文本语音识别
【python的魅力】:教你如何用几行代码实现文本语音识别
|
2天前
|
Python
python re 正则表达式库的使用
python re 正则表达式库的使用
4 0
|
9天前
|
Python
python正则表达式入门
python正则表达式入门
|
15天前
|
Python
Python基础教程(第3版)中文版 第20章 项目1: 自动添加标签(纯文本转HTML格式) (笔记2)
Python基础教程(第3版)中文版 第20章 项目1: 自动添加标签(纯文本转HTML格式) (笔记2)