python regex_Python 正则表达式

定义

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。

简而言之:正则表达式就是记录文本规则的代码。

特点:

操作字符串

1.更快的方式操作字符串;(表单校验,数据匹配...)

2.普通字符串操作无法做到的,或者很难做的正则很容易搞定!!!

使用场景:

1.表单校验

2.api 里面也需要正则

3.[\u4e00-\u9fa5] 中文匹配 Unicode 编码中文匹配

正则表达式代码体验

# Python 解释器为我们提供了一个使用正则的模块,这个模块叫做re(regex)

import re

if __name__ == '__main__':

# 1.match():匹配 -> object

# group():通过匹配后,可以使用group()获取内容

obj = re.match(r"jovelin", "jovelin")

print(obj.group()) # -> jovelin

# 2.如果被匹配的内容多余正则;(只返回开头匹配的部分)

obj = re.match(r"jovelin", "jovelin.cn")

print(obj.group()) # -> jovelin

# 3.如果开头部分,没有匹配的内容; 那么返回None

obj = re.match(r"jovelin", "www.jovelin.cn")

print(obj) # -> None

print(None, type(None)) # -> None

常用的元字符

语法

说明

.

匹配除换行符(\n)以外的任意字符

[]

匹配 [ ] 中列举的字符

\w | \W

匹配字母或数字或下划线或汉字 | 反义

\s | \S

匹配任意的空白符 | 非空白

\d | \D

匹配数字 [0-9] | 非数字

\b | \B

匹配单词的开始或结束 | 反义

^

匹配字符串的开始

$

匹配字符串的结束

代码演示:

# . 匹配任意1个字符(除了 \n)

print(re.match(r'a.b', 'a\nb')) # -> None

# - 在 [] 里代表范围

print(re.match(r'a[a-c]c', 'abc').group()) # -> abc

# 在 [] 里面也想使用 - 那么需要 \ 转义

print(re.match(r'a[a\-c]c', 'a-c').group()) # -> a-c

# \b用法 与 ^ $ 相似,不过 \b 只匹配单词,\B 只匹配非单词

print(re.match(r"\b\w+\b", "0_9_a_z_A_Z汉字").group()) # -> 0_9_a_z_A_Z

print(re.match(r"\B\W+\B", "!@#$%^&*").group()) # -> !@#$%^&*

# ^ 匹配字符串开头

# $ 匹配字符串结尾

print(re.match(r'[\w\W]*$', '0_9_a_z_A_Z汉字!@#$%^&* \n\t').group()) # -> 0_9_a_z_A_Z汉字!@#$%^&*

# 注意: ^ 如果出现在 [] 中,代表的是取反! (想要使用 ^,可以转义 \)

print(re.match(r'^[\^]$', '^').group()) # -> ^

print(re.match(r'^[^^]$', '^')) # -> None

print(re.match(r'^[^47]$', '47')) # -> 47

常用的限定符(量词)

语法

说明

备注

*

重复零次或更多次

>=0

+

重复一次或更多次

>=1

?

重复零次或一次

0|1

{n}

重复n次

==n

{n,}

重复n次或更多次

>=n

{n,m}

重复n到m次

n<=X<=m

代码演示:

# * 匹配前一个字符出现0次或者无限次,即可有可无 (>=0)

print(re.match(r'a*b', 'b').group()) # -> b

# + 匹配前一个字符出现1次或者无限次,即至少有1次 (>=1)

print(re.match(r'a+b', 'b')) # -> None,必须要 1 个 a

# {n} 匹配前一个字符出现n次 == n (== n)

print(re.match(r'a{2}b', 'ab')) # -> None,必须要 2 个 a

# {n,m} 匹配前一个字符出现: n次<= 前一个字符 <=m次 (n<=X<=m)

print(re.match(r'a{2,5}b', 'ab')) # -> None,a 的次数必须是 2<=a<=5

案例:

1.校验手机号

import re

def isMobileNumber(tel):

"""

校验手机号是否正确

"""

if re.match(r"^[1-][34578-]\d{9}$", tel) is None:

return False

else:

return True

print(isMobileNumber("18819950820"))

2.校验邮箱

import re

"""

邮箱名称部分为: [a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+){0,4}

域名部分: [a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+

连起来 ^[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+){0,4}@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+){1,2}$

"""

def isEmail(email):

"""校验邮箱是否正确"""

if re.match(r"^[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+){0,4}@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+){1,2}$", email) is None:

return False

else:

return True

print(isEmail("jovelin@163.com"))

print(isEmail("jovelin.dev@gmail.com"))

print(isEmail("jovelin@163.com.cn"))

print(isEmail("jovelin.dev@gmail.com.cn"))

分组

用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作。

语法

说明

(abc)

将括号中字符作为一个分组

|

匹配左右任意一个表达式

\num

引用分组num匹配到的字符串

(?P)

分组起别名

(?P=name)

引用别名为name分组匹配到的字符串

代码演示:

# (abc) 将括号中字符作为一个分组

print(re.match(r'(aaa)bbb(ccc)', 'aaabbbccc').group())

# 一个括号就是一个分组; group():参数代表分组的编号;写 0 或者不写时,获取全部;

print(re.match(r'(aaa)bbb(ccc)', 'aaabbbccc').group())

print(re.match(r'(aaa)bbb(ccc)', 'aaabbbccc').group(0))

print(re.match(r'(aaa)bbb(ccc)', 'aaabbbccc').group(1))

# | 匹配左右任意一个表达式(和 [] 相似)

print(re.match(r'aaa(xxx|yyy|zzz)bbb', 'aaaxxxbbb').group())

# \num 引用分组 num 匹配到的字符串

# 前后保证一致,要使用到分组!

print(re.match(r'^\w+\1>$', 'nihao').group())

print(re.match(r'^\w+\2>\1>$', '

nihao
').group())

# (?P正则) 分组起别名

# (?P=name) 引用别名为name分组匹配到的字符串

print(re.match(r'^\w+)>\w+)>\w+(?P=re2)>(?P=re1)>$', '

jovelin
').group())

正则高级 API(4个)

语法

说明

search()

搜索字符串中符合正则表达式的内容 -> 只返回第一个

findall()

搜索字符串中符合正则表达式的内容 -> 返回一个列表

sub()

替换字符串中符合正则的内容 -> 替换后的字符串

split()

按照指定正则切割字符串 -> 返回列表

代码演示:

import re

# 1.search()

print(re.search(r"\d+", "aaa111bbb222ccc333ddd").group())

# 2.findall()

print(re.findall(r"\d+", "aaa111bbb222ccc333ddd"))

# 3.sub()

print(re.sub(r"\d+", "***", "aaa111bbb222ccc333ddd"))

# sub(正则, 替换成***, 被操作的字符串, 替换次数)

print(re.sub(r"\d+", "***", "aaa111bbb222ccc333ddd", 2))

# 4.split()

print(re.split(r"\d+", "aaa111bbb222ccc333ddd eee"))

print(re.split(r"\d+|\s", "aaa111bbb222ccc333ddd eee"))

r 的作用

让程序把正则直接当做正则看;(不是从字符串开始解释)

# c:\aaa\bbb\ccc

print('c:\aaa\bbb\ccc')

print('c:\\aaa\\bbb\\ccc')

# 问题:在字符串中写 \ 时会转义,需要写成 \\

# 不写 r 时 \\\\ -> \\

print(re.match('c:\\\\aaa\\\\bbb\\\\ccc', 'c:\\aaa\\bbb\\ccc').group())

# 写 r 时 \\ -> \\

print(re.match(r'c:\\aaa\\bbb\\ccc', 'c:\\aaa\\bbb\\ccc').group())

贪婪/非贪婪

贪婪:(量词在自己的范围内,取最多...)

非贪婪:(量词在自己的范围内,取最少... )

非贪婪用法:量词后面加?

print('贪婪', re.match(r'a+', 'aaa').group()) # -> aaa

# 量词后面加?

print('非贪婪', re.match(r'a+?', 'aaa').group()) # -> a

print('贪婪', re.match(r'a{1,2}', 'aaa').group()) # -> aa

# 量词后面加?

print('非贪婪', re.match(r'a{1,3}?', 'aaa').group()) # -> a

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 怎么处理json_Python是怎样处理json模块的

首先&#xff0c;了解下什么是JSON&#xff1f;JSON&#xff1a;JavaScript Object Notation 【JavaScript 对象表示法】JSON 是一种轻量级的数据交换格式&#xff0c;完全独立于任何程序语言的文本格式。一般&#xff0c;后台应用程序将响应数据封装成JSON格式返回。JSON的基本…

UEditor1.2.6.0在.net环境下使用

UEditor1.2.6.0 1.百度百科词条 2.UEditor官方网站 【CKEditorCKFinder的配置实用&#xff0c;可查看博主另一篇文章】 第一次接触UEditor还是在2011年的下半年里&#xff0c;当时由于需要找一款富文本编辑器进行新闻的网站开发&#xff0c;当时UEditor异常较多&#xff0c;就将…

sql 删除数据_从零开始学SQL:是什么、如何安装、基本语法、表格(创建、删除、更新)、数据(插入、删除、更新)...

一、学习知识的黄金圈思维用黄金圈思维分析自己学习SQL&#xff0c;能增加自己的效率和坚持下去的动力。二、SQL基础知识1.数据库概念&#xff1a; database &#xff0c;按照数据结构来组织、存储和管理数据的仓库。2.关系数据库&#xff1a;多张表表之间的关系表&#xff1a;…

ubuntu ip设置

在Debian(ubuntu就是Debian类linux)中网卡的设置可以通过/etc/network/interfaces文件来进行&#xff0c;具体可分为三种不同的配置方式&#xff1a;DHCP自动获取、静态分配IP地址和PPPoE宽带拨号。 具体设置如下&#xff1a; 在进行配置之前&#xff0c;首先进入/etc/networ…

在mysql中你可以为视图创建索引_mysql中创建视图、索引

数据库的三级模式两级映射: 存储文件------>基本表----->视图 内模式 ------->模式 ------>外模式 一、视图 1、什么是视图: 视图是从一个或多个表中导出来的表,是一种虚拟存在的表。 视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。 这样,用…

mysql 转换编码

ALTER TABLE tablename CONVERT TO CHARACTER SET UTF8;转载于:https://www.cnblogs.com/wuruile/p/3164920.html

嵌入式Linux操作系统的版本查询

嵌入式Linux版本查询&#xff1a; uname -a 显示内核版本 uname -m 显示ARM处理器内核信息 uname -v 显示操作系统的编译时间 linux版本&#xff1a;在linux/utsrelease.h中定义&#xff1a; [cpp] view plaincopy#define UTS_RELEASE "2.6.31-liuqimingxinguodu.com--…

函数使用了堆栈的字节超过_在C语言中如何访问堆栈?

堆栈一般是用来保存变量之类的东西&#xff08;静态变量在内存中&#xff0c;虽然堆栈就是内存的一部分&#xff0c;但为了防止歧义&#xff0c;还是分成两部分来说&#xff09;&#xff0c;一般情况下没必要去故意读取堆栈的值&#xff0c;变量用变量名就可以直接访问&#xf…

怎么解决相位抵消_【录音教程】如何防止话筒拾音的声学相位抵消

设想一下你以单声道的模式为一个吉他歌手做扩声&#xff0c;一支人 声听起来比较古怪&#xff0c;有点“空”&#xff0c;同时有滤波器之类的效果声。为什么会这样&#xff1f;主唱话筒拾取歌手的演唱&#xff0c;同时拾取箱琴的话筒也串入了歌手的声音(见图1)。吉 他话筒离主唱…

win32 ipv6 bind 10014问题

这两天实验了一下&#xff0c;windows xp系统下的 ipv6 udp网络通信。要在windows xp下测试ipv6&#xff0c;首先在命令行窗口下 执行 ipv6 install 和 net start tcpipv6 命令。 在bind本地地址时&#xff0c;发现没法使用 in6addr_any 这通配地址。即下面这种使用方式&a…

string 找出所有数字 index_发现规律,解决整数转罗马数字

嗨&#xff0c;各位&#xff01;我们又准时见面了&#xff0c;即将迎来难得的周末时光&#xff0c;我们今天来一道相对简单的题目逻辑梳理的题目&#xff0c;原定的动态规划的常见题型我们放在周末进行更新。话不多说&#xff0c;我们先看题目&#xff1a; 01 . 题目罗马数字包…

ASP.NET MVC的路由

好久没写博文了&#xff0c;感觉最近好像少了点动力。唉&#xff01;这回就看看这个MVC的路由。 说这个路由机制其实不是MVC里面特有的&#xff0c;ASP.NET里面本身就有的&#xff0c;只不过在WebForm里面一般比较少用&#xff0c;而在MVC里就是把原本的路由扩展了。原本对不知…

win32 ipv6 sendto recvfrom

1. sendto 在windows xp下进行ipv6的udp网络通信时&#xff0c;目标地址应该像如下方式构造 addrinfo hins, *res; memset(&hins, 0, sizeof(hins)); hins.ai_family AF_INET6; hins.ai_socktype SOCK_DGRAM; hins.ai_protocal IPPROTO_UDP; hins.ai_flags AI_NUERICH…

vscode python环境配置_用VScode配置Python开发环境

前言VScode是一个相当优秀的IDE&#xff0c;具备开源、跨平台、模块化、插件丰富、启动时间快、颜值高、可高度定制等等优秀的特质&#xff0c;不愧是微软爸爸的私生子。所以用VScode来编写Python&#xff0c;也是相当的好用的。所以&#xff0c;今天我们就来讲讲&#xff0c;怎…

java情书_Java情书已写好,就差妹子了!

我是Java程序员我用我的方式表达对你的爱&#xff01;我能抽象出整个世界...但是我却不能抽象出你...你肯定是一个单例&#xff0c;因为你是那样的独一无二...所以我的世界并不完整...我可以重载甚至覆盖这个世界里的任何一种方法...但是却不能覆盖对你的思念...也许命中注定了…

JS中的正则表达式小小的技巧---TEST方法的使用

TEST 方法 返回一个 Boolean 值&#xff0c;它指出在被查找的字符串中是否存在模式。 rgexp.test(str) 参数 rgexp 必选项。包含正则表达式模式或可用标志的正则表达式对象。 str 必选项。要在其上测试查找的字符串。 说明 test 方法检查在字符串中是否存在一个模式&#xff0c…

windows下手动配置ipv6地址

在XP,2003等早期版本中&#xff0c;ipv6地址在“网络连接”的属性配置里是无法手工配置的&#xff0c;只能使用netsh配置。配置方法如下&#xff1a;首先&#xff0c;安装IPV6协议&#xff0c;ipv6 install 第二步&#xff0c;查看当前使用的本地连接信息&#xff1a; 如上图&a…

python10的因数_十五道Python小案例,学会这些,Python基础已过关!

十五道Python的小案例&#xff0c;不知道各位都会了多少&#xff01;一、猜数字1到4能组成多少个互不相同且不重复数字的三位数&#xff1f;分别是&#xff1f;分析&#xff1a;可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。程序源代…

java 幽灵引用_Java 幽灵引用的作用

原标题&#xff1a;Java 幽灵引用的作用来源&#xff1a;imzoer&#xff0c;blog.csdn.net/imzoer/article/details/8044900找实习的时候&#xff0c;面试大摩&#xff0c;就遇到了这个问题&#xff0c;当时真不该跟面试官交流这个内容的。垃圾收集过程中&#xff0c;对象的可触…

unique_ptr使用简介

我们知道auto_ptr通过复制构造或者通过赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如我们不希望多个内存块被多个智能指针对象共享,同时又不会像auto_ptr那样不知不觉的就让原来的a…