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)
相关文章
|
5天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
16 5
|
10天前
|
机器学习/深度学习 自然语言处理 API
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程。通过简单的代码示例,展示如何将文本转换为自然流畅的语音,适用于有声阅读、智能客服等场景。
50 3
|
10天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
1月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
46 2
|
1月前
|
Python
【收藏备用】Python正则表达式的7个实用技巧
【收藏备用】Python正则表达式的7个实用技巧
21 1
|
1月前
|
数据安全/隐私保护 Python
Python实用正则表达式归纳
Python实用正则表达式归纳
|
1月前
|
机器学习/深度学习 自然语言处理 大数据
使用Python进行文本情感分析
【10月更文挑战第2天】使用Python进行文本情感分析
30 3
|
1月前
|
Python
Python 正则表达式高级应用指南
正则表达式是文本模式匹配的强大工具,Python 的 `re` 模块支持其操作。本文介绍正则表达式的高级应用,包括复杂模式匹配(如邮箱、电话号码)、分组与提取、替换操作、多行匹配以及贪婪与非贪婪模式的区别。通过示例代码展示了如何灵活运用这些技巧解决实际问题。
27 7
|
2月前
|
Linux 开发者 iOS开发
Python中使用Colorama库输出彩色文本
Python中使用Colorama库输出彩色文本
|
2月前
|
XML 数据格式 Python
Python技巧:将HTML实体代码转换为文本的方法
在选择方法时,考虑到实际的应用场景和需求是很重要的。通常,使用标准库的 `html`模块就足以满足大多数基本需求。对于复杂的HTML文档处理,则可能需要 `BeautifulSoup`。而在特殊场合,或者为了最大限度的控制和定制化,可以考虑正则表达式。
59 12