re模块很重要

re模块

【1】引入

# 必须是 11 位,并且是数字 ,必须符合国家规范
​
# 正常情况下
​
def check_phone_number(phone):
    # 必须是11位
    if len(phone) != 11:
        print(f"手机号位数错误")
    else:
        # 必须全是数字
        if not phone.isdigit():
            print(f"格式错误")
        else:
            # 必须符合规范
            # 校验开头是否合法
            if phone.startswith('13') or phone.startswith('15') or phone.startswith('17') or phone.startswith('18'):
                print(f"正常")
            else:
                print(f"不正常")
​
​
phone = input("phone:")
check_phone_number(phone)
​
# 正则方法
import re
​
​
def check_phone_number(phone_number):
    if re.match('^(13|15|17|18)[0-9]{9}$', phone_number):
        print('yes')
    else:
        print('no')
​
​
phone = input("phone:").strip()
check_phone_number(phone_number=phone)

【2】字符组

正则待匹配字符匹配结果说明
[0123456789]8True在一个字符组里枚举合法的所有字符,字符组里的任意一个字符和"待匹配字符"相同都视为可以匹配
[0123456789]aFalse由于字符组中没有"a"字符,所以不能匹配
[0-9]7True也可以用-表示范围,[0-9]就和[0123456789]是一个意思
[a-z]sTrue同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
[A-Z]BTrue[A-Z]就表示所有的大写字母
[0-9a-fA-F]eTrue可以匹配数字,大小写形式的a~f,用来验证十六进制字符
  • 字符组就是在同一个位置可能出现的字符

  • 字符组用 []

  • 字符组的[备选项] 字母、数字、特殊标点

(1)匹配0-9数字
import re
pattern = "[0123456789]"
res = re.findall(pattern, 'abcdef12356978')
print(res)
# ['1', '2', '3', '5', '6', '9', '7', '8']
(2)匹配小写字母
import re
pattern = "[a-z]"
res = re.findall(pattern,'12341abc21kh')
print(res)
# ['a', 'b', 'c', 'k', 'h']
(3)匹配大写字母
import re
pattern = "[A-Z]"
res = re.findall(pattern,'1234ACD1abcO21KUJkh')
print(res)
# ['A', 'C', 'D', 'O', 'K', 'U', 'J']
(4)大小写字母+数字混合
import re
pattern = "[A-Za-z0-9]"
res = re.findall(pattern,'1,234ACD1abcO21KUJkh')
print(res)
# ['1', '2', '3', '4', 'A', 'C', 'D', '1', 'a', 'b', 'c', 'O', '2', '1', 'K', 'U', 'J', 'k', 'h']

【3】元字符

元字符匹配内容
.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线
\s匹配任意的空白符
\d匹配数字
\n匹配一个换行符
\t匹配一个制表符
\b匹配一个单词的结尾
^匹配字符串的开始
$匹配字符串的结尾
\W匹配非字母或数字或下划线
\D匹配非数字
\S匹配非空白符
a|b匹配字符a或字符b
()匹配括号内的表达式,也表示一个组
[...]匹配字符组中的字符
[^...]匹配除了字符组中字符的所有字符
(1). 代表除换行以外的任意字符
import re
kin = 'abcnHIMN1456'
pattern = "."
res = re.findall(pattern, kin)
print(res)
# ['a', 'b', 'c', 'n', 'H', 'I', 'M', 'N', '1', '4', '5', '6']
(2)\w 代表数字或者字母或下划线
import re
​
kin = 'abcnHIMN1456,_;$'
pattern = "\w"
res = re.findall(pattern, kin)
print(res)
# ['a', 'b', 'c', 'n', 'H', 'I', 'M', 'N', '1', '4', '5', '6', '_']
(3)\s 代表任意的空白符 ---> 空格
import re
​
kin = 'abcn HI MN1456,_;$'
pattern = "\s"
res = re.findall(pattern, kin)
print(res)
# [' ', ' ']
(4)\d 只能匹配数字
import re

kin = 'abcn HI MN1456,_;$'
pattern = "\d"
res = re.findall(pattern, kin)
print(res)
# ['1', '4', '5', '6']
(5)\W 除了字母或数字或者下划线以为的任意字符
import re

kin = 'abcn HI MN1456,_;$'
pattern = "\W"
res = re.findall(pattern, kin)
print(res)
# [' ', ' ', ',', ';', '$']
(6)\n 只能匹配换行符
import re

kin = '''
abc
n HI M
N1456,_;$
'''
pattern = "\n"
res = re.findall(pattern, kin)
print(res)
# ['\n', '\n', '\n', '\n']
(7)\t 制表符
import re

kin = 'abcn HI M%N1456,_;$'
pattern = "\t"
res = re.findall(pattern, kin)
print(res)
# []
(8)\b 匹配一个单词的结尾
(9)^字符 以某个字符开头
import re

kin = 'bcn HI M%cbNkb456,_;$'
pattern = "^b"
res = re.findall(pattern, kin)
print(res)
# ['b']
(10)字符$ 以某个字符结尾
kin = 'bcn HI M%cbNkb456,_;$kh'
pattern = "h$"
res = re.findall(pattern, kin)
print(res)
# ['h']
(11)\D 匹配除数字以外的任意字符
import re

kin = 'bcn HI M%N456,_;$kh'
pattern = "\D"
res = re.findall(pattern, kin)
print(res)
# ['b', 'c', 'n', ' ', 'H', 'I', ' ', 'M', '%', 'N', ',', '_', ';', '$', 'k', 'h']
(12)\S 匹配除空格以外的所有字符
import re

kin = 'bcn HI M%N456,_;$kh'
pattern = "\S"
res = re.findall(pattern, kin)
print(res)
# ['b', 'c', 'n', 'H', 'I', 'M', '%', 'N', '4', '5', '6', ',', '_', ';', '$', 'k', 'h']
(13)字符|字符 匹配任意一个字符
import re

kin = 'bcn HI M%N456,_;$kh'
pattern = "b|c|4|,"
res = re.findall(pattern, kin)
print(res)
# ['b', 'c', '4', ',']
(14)() 声明优先级
import re

kin = 'bcn H 2I M%N 4b 56,4_;$kh'
pattern = "\d(\w)"		# 以数字开头,数字字母或下划线结尾
res = re.findall(pattern, kin)
print(res)
# ['I', 'b', '6', '_']
(15)字符组
import re

kin = 'bcn H 2I M%N 4b 56,4_;$kh'
pattern = "[a-z0-9A-Z][0-9]"		# [大小写和数字都可以,只能数字]
res= re.findall(pattern,kin)
print(res)
# ['56']
import re

kin = 'bcn H 2I M%N 4b 56,4_;$kh'
pattern = "[^a-z0-9A-Z][0-9]"
res= re.findall(pattern,kin)
print(res)
# [' 2', ' 4', ' 5', ',4']

【4】量词

量词用法说明
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
(1)* 代表当前字符重读零次或更多次
import re
pattern = "[0-9][a-z]*"
kin = 'a   b c de$f_g hi jk AB C D E AA bb 5a b6 111 6de,_;'
res = re.findall(pattern, kin)
print(res)
# ['5a', '6', '1', '1', '1', '6de']			前面是数字,后面是小写字母可重读0-n次
(2)+ 代表当前字符重读一次或者更多次
import re
pattern = "[0-9][a-z]+"
kin = 'a   b c de$f_g hi jk AB C D E AA bb 5a b6 111 6de,_;'
res = re.findall(pattern, kin)
print(res)
# ['5a', '6de']			前面是数字,后面是小写字母 可重读1-n次
(3)? 重复零次或一次
import re
pattern = "[0-9][a-z]?"
kin = 'a   b c de$f_g hi jk AB C D E AA bb 5a b6 111 6de,_;'
res = re.findall(pattern, kin)
print(res)		
# ['5a', '6', '1', '1', '1', '6d']		前面是数字,后面是小写字母 可重读0或1次
(4){n} 重复n次
import re
pattern = "[0-9][a-z]{3}"
kin = 'a   b c de$f_g hi jk AB C D5kjnh E AA bb 5aeca b6 111 6de,_;'
res = re.findall(pattern, kin)
print(res)
# ['5kjn', '5aec']			前面是数字,后面是小写字母 必须匹配重读3次
(5){n,m}重复至少n次 至多m次
import re
pattern = "[0-9][a-z]{1,3}"
kin = 'a   b c de$f_g hi jk AB C D5kjnh E AA bb 3u 8y 5aeca b6 111 6de,_;'
res = re.findall(pattern, kin)
print(res)
# ['5kjn', '3u', '8y', '5aec', '6de']		前面是数字,后面是小写字母 可以匹配重读1-3次

【5】位置元字符

  • . 代表任意字符

import re
pattern = "海."
kin = '''海燕海娇海东海冬梅'''
res = re.findall(pattern, kin)
print(res)
# ['海燕', '海娇', '海东', '海冬']
  • . 代表任意字符

  • ^ 以...开头

import re
pattern = "^海."
kin = '''海燕海娇海东海冬梅'''
res = re.findall(pattern, kin)
print(res)
# ['海燕']
  • . 代表任意字符

  • $ 代表以...结尾

import re
pattern = "海.$"
kin = '海燕海娇海东海冬'
res = re.findall(pattern, kin)
print(res)
# ['海冬']
  • . 代表任意字符

  • ? 重复零次或一次

import re
pattern = "李.?"
kin = '李杰李莲英和李二棍子'
res = re.findall(pattern, kin)
print(res)
# ['李杰', '李莲', '李二']
  • . 代表任意字符

  • * 重复零次或者更多次

import re
pattern = "李.*"
kin = '李杰李莲英和李二棍子'
res = re.findall(pattern, kin)
print(res)
# ['李杰李莲英和李二棍子']
  • . 代表任意字符

  • + 重复一次或更多次

import re
pattern = "李.+"
kin = '李杰李莲英和李二棍子'
res = re.findall(pattern, kin)
print(res)
# ['李杰李莲英和李二棍子']
  • . 代表任意字符

  • {m,n} 重复一次或更多次

import re
pattern = "李.{2,3}"
kin = '李杰李莲英和李二棍子'
res = re.findall(pattern, kin)
print(res)
# ['李杰李莲', '李二棍子']
  • . 代表任意字符

  • [] 字符组中的任意一个

import re
pattern = "李[杰莲英二棍子]"
kin = '李杰李莲英和李二棍子'
res = re.findall(pattern, kin)
print(res)
# ['李杰', '李莲', '李二']		从字符组匹配,匹配到一个 后面的就不会再管了
  • . 代表任意字符

  • [] 字符组中的任意一个

  • ^ 和 除了和

  • *任意

import re
pattern = "李[^和]*"
kin = '李杰李莲英和李二棍子'
res = re.findall(pattern, kin)
print(res)

【6】分组匹配

  • | 或条件

  • () 优先匹配

  • [^] 除了当前字符以外的其他字符

【7】贪婪匹配

  • 贪婪匹配:在满足匹配时,匹配尽可能长的字符串, 默认情况下,采用贪婪匹配

  • 非贪婪匹配:在满足匹配时,匹配尽可能少的字符串

  • 常用的非贪婪匹配,pattern

  • *? 重复任意次,但尽可能少重复

  • +? 重复1次或更多次,但尽可能少重复

  • ?? 重复0次或1次,但尽可能少重复

  • {n,m}? 重复n到m次,但尽可能少重复

  • {n,}? 重复n次以上,但是尽可能少重复

【8】方法

(1)findall
  • 返回所有满足匹配条件的结果,放在列表中

import re
sen = "Knight is a good person."
pattern = "i"
result = re.findall(pattern, sen)
print(result)
# ['i', 'i']
(2)search
  • 只匹配到符合条件的一个字符

# 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
import re
sen = "Knight is a good person."
pattern = "i"
result = re.search(pattern, sen)
print(result)
result = re.search(pattern,sen).group()
print(result)
(3)match
# 在开头匹配
import re
sen = "Knight is a good person."
pattern = "K"
result = re.match(pattern, sen)
print(result)
result = re.match(pattern,sen).group()
print(result)
# <re.Match object; span=(0, 1), match='K'>
# K
(4)split
  • 先按"a"分割得到 '空格' 和 'bcd' ,再对 '空格' 和 'bcd' 分别按 'b' 分割

import re
kin = 'abcd'
pattern = '[ab]'
result = re.split(pattern,kin)
print(result)
# ['', '', 'cd']
(5)sub
  • 默认替换所有匹配到的字符,可以用count控制替换次数

import re
kni = 'ev4ak5jda4da6'
# 将数字替换成'K',参数1表示只替换1个
# 默认替换所有匹配到的字符
pattern = '\d'
result = re.sub(pattern, 'K',kni)
result1 = re.sub(pattern, 'K',kni,count=2)
print(result)		# evKakKjdaKdaK
print(result1)		# evKakKjda4da6
(6)subn
  • 替换匹配到的所有字符并返回 替换成功的字符和替换次数

import re
kni = 'ev4ak5jda4da6'
# 将数字替换成'K',返回一个元组(替换的结果,替换的次数)
result = re.subn('\d', 'K',kni)
print(result)
# ('evKakKjdaKdaK', 4)
(7)compile
  • 预编译正则表达式

import re
kni = 'ev456ak5jda4da6'
obj = re.compile('\d{3}')
print(obj)
ret = obj.search(kni)
print(ret.group())				# 456
print(re.findall(obj, kni))		# ['456']

【9】正则方法优先级

(1)findall的优先级查询
import re
pattern = 'www.(baidu|oldboy).com'
pattern = re.compile(pattern)
data = 'www.oldboy.com'
ret = re.findall(pattern, data)     # 在pattern中优先匹配data
print(ret)
# ['oldboy']
ret1 = re.findall('www.(?:baidu|oldboy).com', 'www.baidu.com')
# 优先匹配baidu
print(ret1)
# ['www.baidu.com']
(2)split的优先级查询
  • 在匹配部分加上()之后所切出的结果是不同的

  • 没有()的 没有保留所匹配的项,但是有()的却能够保留匹配的项

  • 这个在某些需要保留匹配部分的使用过程是非常重要的

import re
ret = re.split("\d+","ev456ak5jda4da6")
print(ret)		# ['ev', 'ak', 'jda', 'da', '']

ret = re.split("(\d+)","ev456ak5jda4da6")
print(ret)		# ['ev', '456', 'ak', '5', 'jda', '4', 'da', '6', '']
【10】常用的正则表达式
场景正则表达式
用户名^[a-z0-9_-]{3,16}$
密码^[a-z0-9_-]{6,18}$
手机号码^(?:\+86)?1[3-9]\d{9}$
颜色的十六进制值^#?([a-f0-9]
电子邮箱^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+\.[a-z]+$
URL^(?:https://
IP 地址((2[0-4]\d
HTML 标签^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>
utf-8编码下的汉字范围^[\u2E80-\u9FFF]+$

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

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

相关文章

书生·浦语大模型实战营之OpenXLab 部署 InternLM2 实践指南

书生浦语大模型实战营之OpenXLab 部署 InternLM2 实践指南 本文档将手把手教您如何在 OpenXLab 部署一个 InternLM2-7B chat 的应用 目录 资料介绍书生浦语 InternLM介绍OpenXLab浦源平台介绍部署 InternLM2-Chat-7B demo模型准备上传模型编写代码部署应用 资料介绍 书生浦语…

揭开ChatGPT面纱(1):准备工作(搭建开发环境运行OpenAI Demo)

文章目录 序言&#xff1a;探索人工智能的新篇章一、搭建开发环境二、编写并运行demo1.代码2.解析3.执行结果 本博客的gitlab仓库&#xff1a;地址&#xff0c;本博客对应01文件夹。 序言&#xff1a;探索人工智能的新篇章 随着人工智能技术的飞速发展&#xff0c;ChatGPT作为…

GITHUB的VB代码无法加载的问题解决

GITHUB里有不少好的VB代码&#xff0c;但是下载之后&#xff0c;经常出现工程加载出错的问题&#xff0c;例如&#xff1a; LOG文件为&#xff1a; 不能加载 0 行 0: 不能加载文件 D:\xxxx\Semi VB API Loader\frmMain.frm 。 原因其实很简单&#xff0c;github里的换行符是u…

OpenFE:开启数据特征工程新时代

OpenFE&#xff1a;开启数据特征工程新时代 数据特征工程是机器学习和数据分析领域中至关重要的一环&#xff0c;它涉及对原始数据进行处理和转换&#xff0c;以提取出有用的特征&#xff0c;为模型构建和预测提供更好的输入。在这个领域中&#xff0c;Python库OpenFE为数据科学…

高级控件4:Spinner

Spinner下拉列表组件 主要集合ArrayAdapter、SimpleAdapter以及自定义的Adapter&#xff08;继承自BaseAdapter&#xff09;配合使用实现下拉选择或者对话框中选择某一条目。下拉使用的更多&#xff0c;所以&#xff0c;接下来的案例也会重在演示下拉效果。 本次基本就是上代…

深入理解高级加密标准(Advanced Encryption Standard)

title: 深入理解高级加密标准&#xff08;Advanced Encryption Standard&#xff09; date: 2024/4/23 20:04:36 updated: 2024/4/23 20:04:36 tags: AES概述加密原理优势特点算法详解安全性应用实践案例分析 第一章&#xff1a;AES概述 AES的历史和背景 历史&#xff1a; 高…

【八股文】Spring 谈谈你对AOP的理解

AOP AOP(Aspect-Oriented Programming&#xff0c;面向切面编程)&#xff1a;是一种新的方法论&#xff0c;是对传统 OOP(Object-Oriented Programming&#xff0c;面向对象编程)的补充。 面向对象是纵向继承&#xff0c;面向切面是横向抽取。 OOP思想是一种垂直纵向的继承体…

上网行为管理软件怎么选 三款好用的上网行为管理软件

上网行为管理软件怎么选 三款好用的上网行为管理软件 一款优秀的上网行为管理软件可以满足企业的多种需求&#xff0c;帮助企业有效监督员工的行为&#xff0c;提升工作效率和企业效益&#xff0c;但是这些软件差异较大&#xff0c;选择的时候需要考虑这些因素。 1、明确需求 …

基于一款最多能够支持10000路的 modbus RS485 led灯光控制板做灯控程序

背景 介绍一款之前用过的一款设备&#xff0c;基于RS485通讯协议&#xff0c;控制LED灯或RGB灯带。 设备介绍 之前用它来做智能中药柜的灯控板&#xff0c;结合物联网网关&#xff0c;modbus采集&#xff0c;mqtt转发&#xff0c;以及mqtt的rpc指令下发 设备图片 功能说明 …

Java基本语法(基础部分)

Java基本语法 文章目录 Java基本语法前言一、准备工作1.1 计算机软件与硬件1.2 计算机编程语言1.3 Java语言概述&程序分析1.4 Java环境搭建&Java API1.5 Java核心机制JVM 二、变量2.1 关键字&标识符2.2 变量2.3 数据类型(基本数据类型)2.3.1 基本数据类型2.3.2 基本…

互联网营销两大宗师:周鸿祎和雷军做个人IP有什么不同?

前几天周鸿祎说要把自己的迈巴赫卖了,准备换国产新能源,还喊话让各个车企给他送车去体验。不少车企都送去了自己的最新车型,只有雷军直接回答,“等SUV出”。我们是在吃瓜,作者却是从中看到了新老营销宗师的手法不同。 最近,在纪念互联网30周年的座谈会上,发生了一件趣事…

JAVA网络编程、项目验证码实现

什么是网络编程? 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景&#xff1a;即时通信、网游对战、金融证券、国际贸易、邮件、等等 不管是什么场景&#xff0c;都是计算机跟计算机之间通过网络进行数据传输 Java中可以使用ja…

wordpress建网站主题案例推荐

wordpress企业网站主题案例 https://www.mymoban.com/wordpress/ wordpress公司官网主题案例 https://www.wowsoho.com/jianzhan wordpress外贸主题案例 https://www.wpniu.com/moban

一维递归:递去

示例&#xff1a; /*** brief how about recursive-forward-1? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h>…

深度学习-数据操作

目录 张量通过shape属性访问张量的形状通过shape属性访问张量中元素的总数reshape改变张量的形状&#xff08;不改变元素数量和元素值&#xff09;使用全0、全1、其他常量或者从特定分布中随机采样的数字通过提供包含数值的Python列表为所需张量中的每个元素赋予确定值。张量的…

记录交叉编译环境配置--海思开发板的 嵌入式nginx和 php的移植

嵌入式 lnmp搭建的记录 一些交叉编译的配置环境思路分享&#xff1a;P&#xff1a;php编译PHP可能遇到的问题configure阶段&#xff1a;Makefile-make阶段&#xff1a;Makefile-make install阶段&#xff1a; N&#xff1a;Nginx 文章比较水&#xff0c;并没有没解决什么实际问…

导出JVM的线程信息

1. 查询出Java应用的进程的PID ps -ef|grep java 此时的PID是 33 2. 使用JDK自带的工具jstack导出日志 jstack -l 33 > 2022jstack.log 3.然后直接下载

自动备份的小软件

自动备份的小软件 前几天有个小姐姐和我说&#xff0c;他的硬盘坏了&#xff0c;但是他有没有备份&#xff0c;所以我决定做一个自动备份的软件。 软件整体是使用pythonpyqt5做到。 github链接 软件截图 使用效果 使用方法 教程 流程图 优势 可以很大程度上解决数据丢失…

平均月薪超4.6万!AI领域重磅课程汇总,哈佛,斯坦福,微软,谷歌等出品!

2023年底&#xff0c;由脉脉高聘人才智库发布的《2023泛人工智能人才洞察》报告显示&#xff0c;2023年前八个月内新发布的AI岗位平均月薪超过了4.6万元&#xff0c;而且人才供不应求&#xff0c;甚至出现了5个岗位争夺2个人才的情况。 本文章整理了10项来自全球各高校与知名企…

手把手教数据结构与算法:有序线性表设计

问题描述 设计一个有序线性表类&#xff0c;要求完成初始化&#xff0c;插入和遍历功能&#xff0c;使得表内元素实现有序排列&#xff08;从小到大&#xff09;。同时实现合并功能&#xff0c;使得两个线性表能够合并为一个线性表&#xff08;可能存在重复元素&#xff09;。…
最新文章