正则表达式(python3)

正则表达式(python3)

正则表达式(python3)

正则表达式是对字符操作的一种逻辑公式,就是用事先定义好的一些特定字符以及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑(可以用来截取或替换操作)

作用

1.给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)。

2.可以通过正则表达式,从字符串中获取我们想要的特定部分。

3.还可以对目标字符串进行替换操作。

match方法

re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None。

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

函数参数说明

参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串
flags 标志位,用于控制正则表达式的匹配方式,
例:是否区分大小写,多行匹配等等(可选标志)
修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(localle-aware)匹配
re.M 多行匹配,影响^ $
re.S 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。影响\w,\W,\b,\B
re.X 该标志给予更灵活的格式
#match方法的使用
import re
s = 'hello python'
pattern = 'Hello'
o = re.match(pattern,s,re.I)
print(re.match(pattern,s))
print(dir(o))#查看当前对象使用了什么方法
print(o.group())#返回匹配的字符串
print(o.span())#匹配字符串的范围
print(o.start())

search方法

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

search函数参数说明

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

search与match的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None,而re.search匹配整个字符串,直到找到一个匹配。

m = 'i love you'
print(re.search('love',m))
print(re.match('love',m))
###################结果#############################
<re.Match object; span=(2, 6), match='love'>
None

常用匹配符

符号 描述
. 匹配任意一个字符(除了\n)
[] 匹配列表中的字符串
\w 匹配字母、数字、下划线(a-z,A-Z,0-9,_)
\W 匹配不是字母,数字,下划线
\s 匹配空白字符,(空格\n\t)
\S 匹配不是空白的字符
\d 匹配数字(0-9)
\D 匹配非数字的字符

部分匹配符测试

#
import re
##########.的使用###############
q = 'a'
w = 'A'
e = '_'
r = '\n'
pattern = '.'
q1 = re.match(pattern,q)
w1 = re.match(pattern,w)
e1 = re.match(pattern,e)
r1 = re.match(pattern,r)
print(q1,'\n',w1,'\n',e1,'\n',r1)
#########\d的使用###########
q = '0123'#由结果看只能匹配一个
w = '5'
e = 'a'
r = ' 9'
pattern = '\d'
q1 = re.match(pattern,q)
w1 = re.match(pattern,w)
e1 = re.match(pattern,e)
r1 = re.match(pattern,r)
print(q1,'\n',w1,'\n',e1,'\n',r1)
##########\s的使用#############
q = ' '
w = '\n'
e = '\t'
r = '_'
pattern = '\s'
q1 = re.match(pattern,q)
w1 = re.match(pattern,w)
e1 = re.match(pattern,e)
r1 = re.match(pattern,r)
print(q1,'\n',w1,'\n',e1,'\n',r1)
##############[]的使用#############
q = '2'
w = '3'
e = '4'
pattern = '[2468]'
q1 = re.match(pattern,q)
w1 = re.match(pattern,w)
e1 = re.match(pattern,e)
print(q1,'\n',w1,'\n',e1)


#################测试结果#########################################

<re.Match object; span=(0, 1), match='a'> 
 <re.Match object; span=(0, 1), match='A'> 
 <re.Match object; span=(0, 1), match='_'> 
 None
<re.Match object; span=(0, 1), match='0'> 
 <re.Match object; span=(0, 1), match='5'> 
 None 
 None
<re.Match object; span=(0, 1), match=' '> 
 <re.Match object; span=(0, 1), match='\n'> 
 <re.Match object; span=(0, 1), match='\t'> 
 None
<re.Match object; span=(0, 1), match='2'> 
 None 
 <re.Match object; span=(0, 1), match='4'>

Process finished with exit code 0

泽一匹配符(|)和列表

import re
#泽一和列表的相同点
pattern = '[xyz]'
pa1 = 'x|y|z'
s = 'z'
o = re.search(pattern,s)
o1 = re.search(pa1,s)
print(o,'\n',o1)
print('#########不同点#######')
#泽一和列表的不同点
pattern = '[ab][cd]'
pa1 = 'ab|cd'
s1 = 'bc'
s2 = 'ab'
o1 = re.search(pattern,s1)
o2 = re.search(pattern,s2)
a1 = re.search(pa1,s1)
a2 = re.search(pa1,s2)
print(o1,'\n',o2,'\n',a1,'\n',a2)




################结果##############################
<re.Match object; span=(0, 1), match='z'> 
 <re.Match object; span=(0, 1), match='z'>
#########不同点#######
<re.Match object; span=(0, 2), match='bc'> 
 None 
 None 
 <re.Match object; span=(0, 2), match='ab'>

Process finished with exit code 0

重复数量限定符

提供了对表达式的一部分进行重复处理的功能。

正则表达式中常用的限定符

符号 描述
* 匹配零次或多次
+ 匹配一次或多次
匹配一次或零次
{m} 重复m次
{m,n} 重复m到n次
{m,} 至少m次

部分限定符测试

import re
#############*的使用############
pattern = '\d*'
q = '123qwe'
w = '12345qwe'
e = 'qwe'
q1 = re.match(pattern,q)
w1 = re.match(pattern,w)
e1 = re.match(pattern,e) #匹配空
print(q1,'\n',w1,'\n',e1)
#############+的使用############
pattern = '\d+'
q = '123qwe'
w = '12345qwe'
e = 'qwe'
q1 = re.match(pattern,q)
w1 = re.match(pattern,w)
e1 = re.match(pattern,e)
print(q1,'\n',w1,'\n',e1)
#############{}的使用############
pattern = '\d{2}'
pa1 = '\d{1,}'
q = '123qwe'
w = '1qwe'
e = 'qwe'
q1 = re.match(pattern,q)
w1 = re.match(pattern,w)
e1 = re.match(pa1,e)
q2 = re.match(pa1,q)
w2 = re.match(pa1,w)
e2 = re.match(pa1,e)
print(q1,'\n',w1,'\n',e1)
print(q2,'\n',w2,'\n',e2)


##################结果#######################################
<re.Match object; span=(0, 3), match='123'> 
 <re.Match object; span=(0, 5), match='12345'> 
 <re.Match object; span=(0, 0), match=''>
<re.Match object; span=(0, 3), match='123'> 
 <re.Match object; span=(0, 5), match='12345'> 
 None
<re.Match object; span=(0, 2), match='12'> 
 None 
 None
<re.Match object; span=(0, 3), match='123'> 
 <re.Match object; span=(0, 1), match='1'> 
 None

Process finished with exit code 0

原生字符串

正则表达式里使用“\”作为转移字符。

Python中字符串前面加上 r 表示原生字符串

例:在输出路径的时候要使用两次反斜杠

import re
print('c:\\a\\c\\d')
s = '\\t123'
pattern = '\\\\t\d*'
o = re.match(pattern,s)
pa1 = r'\\t\d*'
o1 = re.match(pa1,s)
print(o,'\n',o1)

############输出结果#################################

c:\a\c\d
<re.Match object; span=(0, 5), match='\\t123'> 
 <re.Match object; span=(0, 5), match='\\t123'>

Process finished with exit code 0

边界字符

字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词的边界
\B 匹配非单词的边界

示例

import re
#匹配QQ邮箱,数字5,10位
# $的使用
a = '321123@qq.com'
b = '321123@qq.com.126'
pattern = '[1-9]\d{4,9}@qq.com'
pa1 = '[1-9]\d{4,9}@qq.com$'
q1 = re.match(pattern,a)
w1 = re.match(pattern,b)
q2 = re.match(pa1,a)
w2 = re.match(pa1,b)
print(q1,'\n',w1,'\n',q2,'\n',w2)
# ^的使用
a = 'hello world'
b = 'python'
pattern = 'hello.*'
pa1 = r'^hello.*'
q1 = re.match(pattern,a)
w1 = re.match(pattern,b)
q2 = re.match(pa1,a)
w2 = re.match(pa1,b)
print(q1,'\n',w1,'\n',q2,'\n',w2)
# \b的使用
a = '1234 abc'
b = '123 ab'
pattern = r'.*\bab'
pa1 = r'.*ab\b'
q1 = re.match(pattern,a)
w1 = re.match(pattern,b)
q2 = re.match(pa1,a)
w2 = re.match(pa1,b)
print(q1,'\n',w1,'\n',q2,'\n',w2)


#########################结果##########################
<re.Match object; span=(0, 13), match='321123@qq.com'> 
 <re.Match object; span=(0, 13), match='321123@qq.com'> 
 <re.Match object; span=(0, 13), match='321123@qq.com'> 
 None
<re.Match object; span=(0, 11), match='hello world'> 
 None 
 <re.Match object; span=(0, 11), match='hello world'> 
 None
<re.Match object; span=(0, 7), match='1234 ab'> 
 <re.Match object; span=(0, 6), match='123 ab'> 
 None 
 <re.Match object; span=(0, 6), match='123 ab'>

Process finished with exit code 0

分组

一个模式中有用一对圆括号括起来的部分,那么这个部分就会作为一组,可以通过group方法的参数获取指定的组匹配的字符串。

字符 功能
(ab) 将括号中的字符作为一个分组
\num 引用分组num匹配到的字符串
(?p) 分别起组名
(?p=name) 引用别名为name分组匹配到的字符串

示例

import re
#匹配座机号码 区号-电话号码 010-43222 0432-447721
#(ab)的使用
pa = '(\d{3,4})-([1-9]\d{4,7}$)'
s = '010-43222'
o = re.search(pa,s)
print(o.group())
print(o.group(1))
print(o.groups())
print(o.groups()[0])

#########################结果#############################
010-43222
010
('010', '43222')
010
#\num的使用
pattern = r'<(.+)><(.+)>.+</\2></\1>'
s = '<html><head>head部分</head></html>'
s1 = '<html><title>head部分</head></body>'
o = re.search(pattern,s)
o1 = re.search(pattern,s1)
print(o,'\n',o1)
#########################结果#############################
<re.Match object; span=(0, 32), match='<html><head>head部分</head></html>'> 
 None
#(?p<name)
pattern = r'<(?P<k_html>.+)><(?P<k_head>.+)>.+</(?P=k_head)></(?P=k_html)>'
s = '<html><head>head部分</head></html>'
s1 = '<html><title>head部分</head></body>'
o = re.search(pattern,s)
o1 = re.search(pattern,s1)
print(o,'\n',o1)
#########################结果#############################
<re.Match object; span=(0, 32), match='<html><head>head部分</head></html>'> 
 None

其他常用函数

sub、subn函数

sub函数和subn函数用于实现搜索和替换功能。这两个函数的功能几乎完全相同,都是将某个字符串中所有匹配正则表达式的部分替换成其他字符串。用来替换的部分可能是一个字符串,也可以是一个函数,该函数返回一个用来替换的字符串。

sub函数返回替换后的结果,subn 函数返回一个元组,元组的第1个元素是替换后的结果,第2个元素是替换的总
数。

语法格式如下:

re.sub(pattern, repl string, count=0,flags=0)

import re
#sub和subn的使用
s = '2021-959-456 # 这是一个国外的电话 123'
pa1 = r'#.*'
pa2 = r'#\D*'
result1 = re.sub(pa1,"",s)
result2 = re.sub(pa2,"",s)
result3 = re.subn(pa2,"",s)
print(result1)
print(result2)
print(result3,'\t',result3[0],'\t',result3[1])
#########################结果#############################
2021-959-456 
2021-959-456 123
('2021-959-456 123', 1) 	 2021-959-456 123 	 1

compile函数

compile函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,供match()和search()使用。

语法格式:

re.compile(pattern[ flags])

参数说明

参数 描述
pattern 一个字符串形式的正则表达式
flags 可选,表示匹配模式,例如:忽略大小写,多行模式等
#compile
s = '2021-959-456 # 这是一个国外的电话 123'
pattern = re.compile(r'\w*')
o = pattern.search(s)
print(o)
#########################结果#############################
<re.Match object; span=(0, 4), match='2021'>

findall函数

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,
则返回空列表。语法格式如下:

findal[(pattern, string, flags=0)

参数说明

参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串
flags 可选,表示匹配模式,例如:忽略大小写,多行模式等

finditer函数

和findall类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回

#findall和finditer函数
s = 'first 1 second 2 third 3'
pattern = r'\w+'
o1 = re.findall(pattern,s)
o2 = re.finditer(pattern,s)
print(o1)
print(o2)
for i in o2:
    print(i.group(),end="\t")
#########################结果#############################
['first', '1', 'second', '2', 'third', '3']
<callable_iterator object at 0x000001BE65638668>
first	1	second	2	third	3

split函数

split函数用于根据正则表达式分隔字符串,也就是说,将字符串与模式匹配的子字符串都作为分隔符来分隔这个字符串。split 函数返回一个列表形式的分隔结果,每一个列表元素都是分隔的子字符串。

语法格式如下:

re.split(pattern, string[ maxsplit=0, flags=0])

参数说明

参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串
maxsplit 分隔次数,maxsplit = 1分隔一次,默认为0,不限制次数
flags 可选,表示匹配模式,例如:忽略大小写,多行模式等
#split函数
s = 'first1second22third 3'
pattern = r'\d+'
o1 = re.split(pattern,s)
o2 = re.split(pattern,s,maxsplit=2)
print(o1)
print(o2)
#########################结果#############################
['first', 'second', 'third ', '']
['first', 'second', 'third 3']

贪婪模式和非贪婪模式

贪婪模式指Python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符。非贪婪模式与贪婪相反,总是尝试匹配尽可能少的字符,可以使用重复数量限定符后面加上?,使贪婪变成非贪婪。

import re

v = re.match(r'(.+)(\d+-\d+-\d+)','This is my tel:133-1234-1234')
print('--------贪婪模式-------')
print(v.group(1))
print(v.group(2))
print('--------非贪婪模式-------')
v = re.match(r'(.+?)(\d+-\d+-\d+)','This is my tel:133-1234-1234')
print(v.group(1))
print(v.group(2))
#########################结果#############################
--------贪婪模式-------
This is my tel:13
3-1234-1234
--------非贪婪模式-------
This is my tel:
133-1234-1234

Process finished with exit code 0

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100120.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • SVN安装配置以及启动[通俗易懂]

    SVN安装配置以及启动[通俗易懂]SVN是一个开放源代码的版本控制系统,全称叫做Subversionwindows下载链接地址1.下载并安装下载好之后直接双击,然后安装就没什么好说的了,这个软件安装及其简单。2.验证cmd中敲svn–version,如果出现下面的结果,则说明安装成功了!(上面没问题的可以忽略这一段!)如果有问题,检查自己的环境变量有没有把对应的bin目录配置进去,现在安装的svn大部分都会自动配置的,如果他没有自动配置,则需要手动编辑path:3.配置svn仓库:我的做法是在安装目录下建一个空文

    2022年10月21日
  • api header_apipost接口测试

    api header_apipost接口测试使用apipost进行接口测试的时候,有时候会用到一些自定义或者不常见的content-type格式,这个时候就要手动在header头部自定义content-type。这里我们自定义一个content-type,格式为application/octet-stream然后body选择的为form-data,然后什么body中什么都不填写,点击发送,发送的content-type的格式是为自定义的application/octet-stream。在body中添加参数进行发送,结果content-typ

  • curl_init()

    curl_init()
    $ch=curl_init();
    $c_url=’http://?’;
     $c_url_data=”product_id=”.$product_id.”&type=”.$type.””;
     curl_setopt($ch,CURLOPT_URL,$c_url);
     curl_setopt($ch,CURLOPT_POST,1);
     curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

  • Java程序设计(高级及专题)- 异常机制「建议收藏」

    Java程序设计(高级及专题)- 异常机制「建议收藏」Java程序设计(高级及专题)- 异常机制

  • MBus总线的基础学习

    MBus总线的基础学习MBus总线是一种主从式半双工传输总线,采用主叫/应答的方式通信,即只有处于中心地位的主站(Master)发出询问后,从站(Slave)才能向主站传输数据。MBus的主要特点如下:1、两线制总线,不分正负极性,施工简单;2、采用独特的电平特征传输数字信号,抗干扰能力强,传输距离长;3、可以选着总线供电,降低维护成本;4、总线型拓扑结构,扩展方便,组网成本低;5、任一

    2022年10月16日
  • 微信聊天内容制作生成器微信小程序源码/支持多种制作生成[通俗易懂]

    ☑️编号:ym205☑️品牌:小程序☑️语言:wx☑️大小:345KB☑️类型:聊天内容制作☑️支持:小程序????欢迎免费领取(注明编号)????✨源码介绍这是一款微信聊天内容制作生成小程序源码,该小程序支持制作多种内容。支持单人聊天模式制作,支持群聊模式制作生成;每一种模式都支持我们微信需要的功能都有,视频,语音,时间,内容等等,大家可以最后看演示图!!另外还支持微信零钱,也就是我的界面制作生成DIY金额(具体大家看演示图);另外也支持微信红包制作DIY金额,发

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号