【Python高级语法与正则表达式】

目录

1.正则表达式

1.1概述:

1.2re模块介绍

1.3re模块相关方法(常用):

 1.4案例

1.5正则表达式详解

1.5.1查什么

1.5.2查多少

1.5.3 从哪查

 1.6重要概念

1.6.1子表达式

 1.7 正则表达式的其他方法

1.7.1选择匹配符

1.7.2分组别名

2.高级语法

2.1迭代器

2.2生成器

2.2.1生成器推导式

2.2.2yield生成器

2.2.3yield关键字和return关键字

1.正则表达式

1.1概述:

正则表达式(regular expression)描述了一种字符串匹配的‘模式’,可以用来检查一个串是否含有’某种‘子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

模式:一种特定的字符串模式,这个模式是通过一些特殊的符号组成的。 某种:也可以理解为是一种模糊匹配。

精准匹配:select * from blog where title='python';

模糊匹配:select * from blog where title like ‘%python%’;

正则表达式并不是Python所特有的,在Java、PHP、Go以及JavaScript等语言中都是支持正则表达式的。

正则表达式的功能:

①模式匹配:根据指定的模式在文本中查找匹配项。
②验证输入:检查用户的输入是否符合预定义的格式,如邮箱地址、电话号码等。
③搜索与替换:在文本中搜索特定模式并进行替换。
④分割字符串:根据指定的模式将字符串分割成多个子串。
⑤提取信息:从大量文本中提取出所需的信息,如日期、时间、价格等。
⑥条件判断:在编程中作为条件语句的一部分,根据正则表达式的匹配结果执行不同的逻辑

1.2re模块介绍

在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个re模块

使用三步走:

# 第一步:导入re模块
import re
# 第二步:使用match方法进行匹配操作
result = re.match(pattern正则表达式, string要匹配的字符串, flags=0)
# 第三步:如果数据匹配成功,使用group方法来提取数据
result.group()

函数参数说明:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

匹配成功re.match方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配数据。

# 需求: 匹配某字符串
# match: 默认从开头开始匹配,匹配成功返回re.Match对象,然后用group()获取数据
# 1.导包
import re

# 2.匹配   match(规则,要匹配的大字符串)
result = re.match('abcd', 'abcd是我随便打的字母')
print(result,type(result))
# 3.获取匹配成功的数据
if result:
    print('匹配成功:', result.group())
else:
    print('匹配失败')
# 匹配成功: abcd

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

修饰符描述
re.I==使匹配对大小写不敏感==
re.L做本地化识别(locale-aware)匹配,这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\w,在英文环境下,它代表[a-zA-Z0-9_],即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配"é" 或 "ç"。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。
re.M==多行匹配,影响 ^ 和 $==
re.S==使 . 匹配包括换行在内的所有字符==
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.XVERBOSE,冗余模式, 此模式忽略正则表达式中的空白和#号的注释,例如写一个匹配邮箱的正则表达式。该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

1.3re模块相关方法(常用):

☆ re.match(pattern, string, flags=0)

  • 必须从字符串的起始位置匹配,如果匹配成功则返回匹配内容, 否则返回None

☆ re.search(pattern, string, flags=0) 

  •  可以从整个字符串任意匹配,但是只匹配成功,只返回符合规则的第一个结果,放到re.Match对象且用group()获取匹配结果, 否则返回None

☆ re.findall(pattern, string, flags=0)

  • 扫描整个串,返回所有与pattern匹配的列表

  • 注意: 如果pattern中有分组则返回与分组匹配的列表

  • 举例: re.findall("\d","chuan1zhi2") >> ["1","2"]

☆ re.finditer(pattern, string, flags)

  • 功能与上面findall一样,不过返回的是迭代器

参数说明:

  • pattern : 模式字符串。

  • repl : 替换的字符串,也可为一个函数。

  • string : 要被查找替换的原始字符串。

  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

  • flags: 匹配方式:

    • re.I 使匹配对大小写不敏感,I代表Ignore忽略大小写

    • re.S 使 . 匹配包括换行在内的所有字符

    • re.M 多行模式,会影响^,$

 1.4案例

查找一个字符串中是否具有数字“8”

import re

result = re.findall('8', '13566128753')
# print(result)
if result:
    print(result)
else:
    print('未匹配到任何数据')

 查找一个字符串中是否具有数字

import re

result = re.findall('\d', 'a1b2c3d4f5')
# print(result)
if result:
    print(result)
else:
    print('未匹配到任何数据')

 查找一个字符串中是否具有非数字

import re

result = re.findall('\D', 'a1b2c3d4f5')
# print(result)
if result:
    print(result)
else:
    print('未匹配到任何数据')

1.5正则表达式详解

正则表达式通常是由两部分数据组成的:普通字符 与 元字符

普通字符:0123456789abcd@...

元字符:正则表达式所特有的符号 => [0-9],^,*,+,?

正则编写三步走:查什么、查多少、从哪查

1.5.1查什么

代码功能
.(英文点号)匹配任意某1个字符(除了\n)
[ ]匹配[ ]中列举的某1个字符,专业名词 => ==字符簇==
[^指定字符]匹配除了指定字符以外的其他某个字符,^专业名词 => ==托字节==
\d匹配数字,即0-9
\D匹配非数字,即不是数字
\s匹配空白,即 空格,tab键
\S匹配非空白
\w匹配非特殊字符,即a-z、A-Z、0-9、_
\W匹配特殊字符,即非字母、非数字、非下划线

字符簇常见写法:

① [abcdefg] 代表匹配abcdefg字符中的任意某个字符(1个)

② [aeiou] 代表匹配a、e、i、o、u五个字符中的任意某个字符

③ [a-z] 代表匹配a-z之间26个字符中的任意某个

④ [A-Z] 代表匹配A-Z之间26个字符中的任意某个

⑤ [0-9] 代表匹配0-9之间10个字符中的任意某个

⑥ [0-9a-zA-Z] 代表匹配0-9之间、a-z之间、A-Z之间的任意某个字符

字符簇 + 托字节结合代表取反的含义:

① [^aeiou] 代表匹配除了a、e、i、o、u以外的任意某个字符

② [^a-z] 代表匹配除了a-z以外的任意某个字符

\d 等价于 [0-9], 代表匹配0-9之间的任意数字

\D 等价于 [^0-9],代表匹配非数字字符,只能匹配1个

字符匹配大全网址:https://www.jb51.net/article/161544.htm

1.5.2查多少

代码功能
*匹配前一个字符出现0次或者无限次,即可有可无(0到多)
+匹配前一个字符出现1次或者无限次,即至少有1次(1到多)
?匹配前一个字符出现1次或者0次,即要么有1次,要么没有(0或1)
{m}匹配前一个字符出现m次,匹配手机号码\d{11}
{m,n}匹配前一个字符出现从m到n次,\w{6,10},代表前面这个字符出现6到10次

基本语法:

正则匹配字符.或\w或\S + 跟查多少

如\w{6, 10}

如.*,匹配前面的字符出现0次或多次

1.5.3 从哪查

代码功能
^匹配以某个字符串开头
$匹配以某个字符串结尾

 1.6重要概念

1.6.1子表达式

在正则表达式中,通过一对圆括号括起来的内容,我们就称之为=="子表达式"==。

import re

result = re.search(r'\d(\d)(\d)', 'abcdef123ghijklmn')
# print(result)
if result:
    print(result)
else:
    print('未匹配到任何数据')
# <re.Match object; span=(6, 9), match='123'>
注意:Python正则表达式前的 r 表示原生字符串(rawstring),该字符串声明了引号中的内容表示该内容的原始含义,避免了多次转义造成的反斜杠困扰。

正则表达式中\d\d\d中,(\d)(\d)就是子表达式,一共有两个()圆括号,则代表两个子表达式

说明:findall方法,如果pattern中有分组则返回与分组匹配的列表,所以分组操作中不适合使用findall方法,建议使用search(匹配一个)或finditer(匹配多个)方法。

1.6.2捕获 

当正则表达式在字符串中匹配到相应的内容后,计算机系统会自动把子表达式所匹配的到内容放入到系统的对应缓存区中(缓存区从$1开始)

案例演示

import re


# 匹配字符串中连续出现的两个相同的单词
str1 = 'abcdef123ghijklmn'
result = re.search(r'\d(\d)(\d)', str1)
print(result.group())
print(result.group(1))
print(result.group(2))
#123
#2
#3

 1.7 正则表达式的其他方法

1.7.1选择匹配符

|可以匹配多个规则

案例:匹配字符串hellojava或hellopython

import re

str = 'hellojava, hellopython'
result = re.finditer(r'hello(java|python)', str)
if result:
    for i in result:
        print(i.group())
else:
    print('未匹配到任何数据')

1.7.2分组别名

代码功能
(?P<name>)分组起别名
(?P=name)引用别名为name分组匹配到的字符串

案例:匹配<book></book>

# 导入模块
import re

str1 = '<book></book>'
result = re.search(r'<(?P<mark>\w+)></(?P=mark)>', str1)

print(result.group())

2.高级语法

2.1迭代器

迭代器(Iterator)是 Python 中的一种对象,用于在数据集合中逐个访问元素,而不需要暴露数据集合的底层实现。它提供了一种遍历集合元素的标准方式,适用于任何支持迭代的数据结构,如列表、元组等,range()就是一个迭代器

迭代器是一个实现了 iter() 和 next() 方法的对象,使得可以逐步遍历它的元素。 特点: 手动管理:需要显式地实现 iter() 和 next() 方法。 状态管理:迭代器需要自己管理迭代的状态,包括当前位置和结束条件。 内存使用:内存使用取决于迭代器的实现,通常是惰性计算(即按需生成数据)。

(一般认为,有重写__iter__跟__next__这个两个模式方法的类,就是迭代器)

# 自定义迭代器类
class my_range:
    def __init__(self, start = 0, end = 0, step=1):
        self.current = start
        self.end = end
        self.step = step

    # 返回迭代器本身
    def __iter__(self):
        return self

    # 返回下一个值
    def __next__(self):
        if self.current >= self.end:
            raise StopIteration
        else:
            value = self.current
            self.current += self.step
            return value


# 注意: 迭代器是惰性的, 只有在需要时才计算, 因此可以无限迭代下去
# 使用自己的迭代器类完成类似range的效果
for i in my_range(1, 5, 2):
    print(i)
print("-----------------------------------------------")
for i in range(1, 5, 2):
    print(i)

2.2生成器

(底层逻辑就是一个迭代器)

创建生成器方式:

① 生成器推导式

② yield 关键

2.2.1生成器推导式

与列表推导式类似,只不过生成器推导式使用小括号。

# 创建生成器
my_generator = (i * 2 for i in range(5))
print(my_generator)

# next获取生成器下一个值
# value = next(my_generator)
# print(value)

# 遍历生成器
for value in my_generator:
    print(value)

生成器相关函数:

next 函数获取生成器中的下一个值
for  循环遍历生成器中的每一个值 

2.2.2yield生成器

yield 关键字生成器的特征:在def函数中具有yield关键字

# 1.定义函数用于生成1,2,3
# 原始方式
from collections.abc import Iterable, Iterator


def get_nums():
    return 7, 8, 9


# 生成器方式
def generate_nums():
    # 注意: yield 值  阻塞程序,直到调用next()方法或者for循环生成值,然后回来从阻塞位置继续执行
    print('开始生成1...')
    yield 1
    print('开始生成2...')
    yield 2
    print('开始生成3...')
    yield 3


# 2.再调用函数
# 调用原始方式: 默认先把1,2,3放到一个元组中,然后返回
print(get_nums())
print('------------------')
# 调用生成器方式: 默认返回生成器对象,然后调用next()方法或者for循环
gen = generate_nums()
# 注意: 生成器是可迭代对象, 同时是迭代器
print(isinstance(gen, Iterable))
print(isinstance(gen, Iterator))
# next()方式: 弊端: 需要手动调用next()方法 且容易超出范围
# print(next(gen))
# print(next(gen))
# print(next(gen))
# print('------------------')
# for循环方式: 优势: 不容易超出范围 默认会循环获取到结束为止
for i in gen:
    print(f"for循环获取{i}")

注意点:

① 代码执行到 yield 会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行

② 生成器如果把数据生成完成,再次获取生成器中的下一个数据会抛出一个StopIteration 异常,表示停止迭代异常

③ while 循环内部没有处理异常操作,需要手动添加处理异常操作

④ for 循环内部自动处理了停止迭代异常,使用起来更加方便,推荐大家使用。

2.2.3yield关键字和return关键字

如果不太好理解yield,可以先把yield当作return的同胞兄弟来看,他们都在函数中使用,并履行着返回某种结果的职责。

这两者的区别是:

return的函数直接返回所有结果,程序终止不再运行,并销毁局部变量;

def example():
    x = 1
    return x

example = example()
print(example)

而有yield的函数则返回一个可迭代的 generator(生成器)对象,你可以使用for循环或者调用next()方法遍历生成器对象来提取结果。

def example():
    x = 1
    y = 10
    while x < y:
        yield x
        x += 1

example = example()
print(example)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/930720.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue03

目录 一、今日目标 1.生命周期 2.综合案例-小黑记账清单 3.工程化开发入门 4.综合案例-小兔仙首页 二、Vue生命周期 三、Vue生命周期钩子 四、生命周期钩子小案例 1.在created中发送数据 六、工程化开发模式和脚手架 1.开发Vue的两种方式 2.Vue CLI脚手架 基本介绍…

云轴科技ZStack出席中国电信国际EMCP平台香港发布会,持续推动海外合作

近日&#xff0c;以“云聚未来 翼起新篇”为主题的中国电信国际多云服务一站式平台&#xff08;E-surfing Managed Cloud Platform&#xff0c;简称EMCP平台&#xff09;新闻发布会在香港成功举办&#xff0c;标志着中国电信国际在云计算服务领域取得了又一重大进展。云轴科技…

Alibaba Druid(简称Druid)

目录 核心功能 数据源配置与管理&#xff1a; 高性能与可扩展性&#xff1a; 监控与SQL解析&#xff1a; 安全性&#xff1a; 应用场景 使用方式 配置示例 通过yaml方式配置 web.xml中配置 访问Druid的监控页面 监控页面展示 Alibaba Druid&#xff08;简称Druid&am…

JavaWeb学习--cookie和session

目录 &#xff08;一&#xff09;Cookie概述 1.什么叫Cookie 2.Cookie规范 3.Cookie的覆盖 4.cookie的最大存活时间 ​​​​​​&#xff08;Cookie的生命&#xff09; &#xff08;二&#xff09; Cookie的API 1.创建Cookie&#xff1a;new 构造方法 2.保存到客户端浏…

策略模式实战 - 猜拳游戏

**可以整体的替换一套算法&#xff0c;这就是策略模式。**这样对于同一个问题&#xff0c;可以有多种解决方案——算法实现的时候&#xff0c;可以通过策略模式来非常方便的进行算法的整体替换&#xff0c;而各种算法是独立封装好的&#xff0c;不用修改其内部逻辑。 具体的实…

Transformer简述和实现

Transformer 1、概述 (一)、诞生 自从2017年此文《Attention is All You Need》提出来Transformer后&#xff0c;便开启了大规模预训练的新时代&#xff0c;也在历史的长河中一举催生出了GPT、BERT这样的里程碑模型。 (二)、优势 相比之前占领市场的LSTM和GRU模型&#xf…

Astro 5.0 发布

Astro 5.0 发布&#xff01; 使用 Astro Content Layer 可以从任何来源加载内容&#xff0c;并使用 Server Islands 将缓存的静态内容与动态个性化内容结合起来。 什么是 Astro Astro 是用于构建内容驱动网站&#xff08;包括博客、营销和电子商务&#xff09;的 Web 框架。…

数据结构与算法-03链表-04

链表与递归 在链表操作中移除、反转经常会用到递归实现。通过力扣案例理解链表常规操作中的递归实现。 移除数据 删除链表的节点 问题 LCR 136. 删除链表的节点 - 力扣&#xff08;LeetCode&#xff09; 问题描述 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定…

Let up bring up a linux.part2 [十一]

之前的篇幅中我们已经将 Linux 内核 bringup 起来了&#xff0c;不知道大家有没有去尝试将根文件系统运行起来&#xff0c;今天我就带领大家完成这个事情&#xff0c;可以跟着下面的步骤一步步来完成&#xff1a; 在这里我们使用 busybox 构建 rootfs&#xff1a; 下载 busyb…

WEB开发: Node.js路由之由浅入深(一) - 全栈工程师入门

作为一个使用Node.js多年的开发者&#xff0c;我已经习惯于用Node.js写一些web应用来为工作服务&#xff0c;因为实现快速、部署简单、自定义强。今天我们一起来学习一个全栈工程师必备技能&#xff1a;web路由。&#xff08;观看此文的前提是默认你已经装好nonde.js了&#xf…

新书速览|循序渐进Node.js企业级开发实践

《循序渐进Node.js企业级开发实践》 1 本书内容 《循序渐进Node.js企业级开发实践》结合作者多年一线开发实践&#xff0c;系统地介绍了Node.js技术栈及其在企业级开发中的应用。全书共分5部分&#xff0c;第1部分基础知识&#xff08;第1&#xff5e;3章&#xff09;&#xf…

二代证信息读写器安卓身份证手持终端pda

HT530是一款可满足不同应用需求的多功能身份证核验手持机。Android 10操作系统&#xff0c;搭载高性能8核心2.0G主频处理器&#xff0c;5.5寸高清大屏&#xff0c;1300万摄像头&#xff1b;内存2G16G,4G64G可选。条码扫描&#xff08;扫描头可选&#xff09;、可离线采集、读取…

Redis的高可用之哨兵模式

Redis哨兵主要是解决Redis主从同步时主数据库宕机问题,使其能够自动进行故障恢复&#xff0c;提高Redis系统的高可用性。 1. 哨兵的作用&#xff1a; 监控&#xff1a;哨兵通过心跳机制监控主库和从库的存活性。 选主&#xff1a;当主库宕机时&#xff0c;哨兵会选举出一个领…

2024最新版python+pycharm安装与配置(mac和window都有讲)

PS&#xff1a;这篇是对于初学者的pythonpycharm配置教程 &#xff0c;配置完成后可以直接看我的python学习笔记来进行python全套学习目前正在持续更新。 目录 python以及pycharm的安装配置一、下载安装Python1、python环境检查2、系统环境检查3、python下载4、开始安装5、检查…

【css】基础(二)

本专栏内容为&#xff1a;前端专栏 记录学习前端&#xff0c;分为若干个子专栏&#xff0c;html js css vue等 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;css专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &a…

OceanBase 的探索与实践

作者&#xff1a;来自 vivo 互联网数据库团队- Xu Shaohui 本文总结了目前我们遇到的痛点问题并通过 OceanBase 的技术方案解决了这些痛点问题&#xff0c;完整的描述了 OceanBase 的实施落地&#xff0c;通过迁移到 OceanBase 实践案例中遇到的问题与解决方案让大家能更好的了…

【开源免费】基于Vue和SpringBoot的服装生产管理系统(附论文)

博主说明&#xff1a;本文项目编号 T 066 &#xff0c;文末自助获取源码 \color{red}{T066&#xff0c;文末自助获取源码} T066&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

租赁小程序的优势与应用场景解析

内容概要 租赁小程序&#xff0c;听起来是不是很酷&#xff1f;其实&#xff0c;它就是一个让你可以方便地租借各种高成本但用得不频繁的商品的平台。想象一下&#xff0c;当你需要租一件派对用的华丽小礼服&#xff0c;或是想体验一下超酷的运动器材&#xff0c;租赁小程序就…

MySQL 权限管理分配详解

MySQL 权限管理分配详解 MySQL权限系统的工作原理权限表的存取用户通过权限认证、进行权限分配的流程账号管理我们常用的授权all privileges到底有哪些权限呢&#xff1f;以及带来的安全隐患有哪些&#xff1f;创建账户的时候最好分配指定的权限&#xff0c;这样子安全也高管理…