python字符串常用操作2:正则表达式、%的使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_41611045/article/details/95722512

一、正则表达式
正则表达式是python中进行字符串匹配的模式,其中包括特定字符串的寻找,替换等等操作,其中正则表达式存在python的re模块,主要有下面四种函数
1、search(pattern, string) 在一个字符串中查找匹配
2、findall(pattern, string ,flags=0) 找到匹配,返回所有匹配部分的列表
3、sub(pattern, repl, string , count=0, flags=0) 将字符串中匹配正则表达式的部分替换为其他值
4、split(pattern, string ,maxsplit=0, flags=0) 根据匹配分割字符串,返回分隔符串组成的列表

1、search
search类似于字符串查找中的find,字符串中的find有str.find(字符串),如果找到字符串返回字符串所在的索引,否则返回-1,例如:,

import re
str1='imooc video=1000' 
str1.find("1000")
#结果12
str1.find("lalal")
#结果-1

②search,search在字符串中搜索,搜搜完成后用group()打印
例1:在str1=‘imooc video=1000’ 中搜索1000

a=re.search("1000",str1)
a.group()
#结果:'1000'

注意如果搜索不到的话,边不能用.group()打印会报错

例2:在"彭闯"中搜索pengchuang

str1="彭闯"
a=re.search("pengchuang",str1,flags=1)
print(a)
#结果:None

例3:在str1=‘java=1000,python=9090’ 搜索任意数字

str1='java=1000,python=9090'  
info=re.search(r'\d+',str1)#'\d'代表任意一个数字,'+'可以匹配数字一次或者无限次,只能匹配最前
info.group()
结果:1000'

③match(pattern,string)
同样python中有match匹配,不过match是从开头开始比对,而search是从整个字符串开始比对,比如
re.match(“1000”,“lalal1000”)就返回None

总结:
①re.search(pattern, string),在string中寻找字符串pattern,如果找到了用group()打印字符串,如果没找到返回None,只匹配一次,找到就返回,与find()区别,find不支持正则表达式
②同样python中有match匹配,不过match是从开头开始比对,而search是从整个字符串开始比对

2、findall(pattern, string)
找到匹配,返回所有匹配部分的列表

str1="彭闯"
a=re.findall("pengchuang",str1,flags=1)
print(a)
#结果:[]

str1='java=1000,python=9090'  
info=re.findall(r'\d+',str1)#'\d'代表任意一个数字,'+'可以匹配数字一次或者无限次,只能匹配最前
print(info)
#结果:['1000', '9090']

str1="1 0 0 0 "
info=re.findall(r'\d+',str1)#'\d'代表任意一个数字,'+'可以匹配数字一次或者无限次,只能匹配最前
print(info)
#结果:['1','0','0','0']

findall会匹配所有找到的字符,如果找到了会将所有字符返回列表,如果没找到,则会返回[]

总结:findall会匹配所有字符,如果找到了会将所有字符返回列表,如果没找到,则会返回[]

3、sub(pattern1,pattern2,string)
sub(匹配字符,替换字符,string,count=0)
将字符串中匹配正则表达式的部分替换为其他值

1:替换字符串中pengchuang为彭闯
str1="pengchuang is a good boy"
info=re.sub('pengchuang',"彭闯",str1)#
print(info)
#结果:彭闯 is a good boy

②其中的count参数代表替换次数,count=1,替换一次,依次类推,count=0全部替换

str1="pengchuang is a good boy,pengchuang is a student"
info=re.sub('pengchuang',"彭闯",str1,count=1)#
print(info)
#'彭闯 is a good boy,pengchuang is a student'

4、split()分割字符

(1)split
①普通匹配
例1:
用空格分割字符串

str1 = "Line1-abcdef \nLine2-abc \nLine4-abcd"
print(str1)
print(str1.split())

结果
Line1-abcdef Line2-abc Line4-abcd
[‘Line1-abcdef’, ‘Line2-abc’, ‘Line4-abcd’]

例2:用||分割字符串

str7='我是||南京||邮电大学的学生'
print(str7)
#str7.split(r'||')
print(str7.split('||'))

[‘我是’, ‘南京’, ‘邮电大学的学生’]

例3:用|分割字符串

str8='我是|南京|邮电大学的学生'
print(str8)
#str7.split(r'||')
print(str8.split('|'))

[‘我是’, ‘南京’, ‘邮电大学的学生’]

注:split默认用所有空格分割字符串
②关于斜杠的转译
例4:以\来切割字符串

str9='我是\南京\邮电大学的学生'
print(str9)
#str7.split(r'||')
print(str9.split('\\'))

结果:
我是\南京\邮电大学的学生
[‘我是’, ‘南京’, ‘邮电大学的学生’]
例5:以双\分割字符

str10=r'我是\\南京\\邮电大学的学生'
print(str10)
print(str10.split(r"\\"))

结果:
我是\南京\邮电大学的学生
[‘我是’, ‘南京’, ‘邮电大学的学生’]

(2)re.split
re.split(pattern, string ,maxsplit=0, flags=0) 根据匹配分割字符串,返回分隔符串组成的列表
maxsplit:最大分割次数
例1:
①多个分割符分割

str6='imooc:java c++ python c#'  
info=re.split(r':| ',str6)#
#利用:和空格分隔
print(info)
#结果:['imooc', 'java', 'c++', 'python', 'c#']

②关于特殊符号的转译
例2:||的正则表达

str1=r'我是||南京||邮电大学的学生'
print(str1)
info=re.split("\|\|",str1)#
print(info)

|在正则表达式中是有特殊含义的,所以这里用||代表直接正则表达,即将|转为符号
例3:\的正则表达

str2=r'我是\南京\邮电大学的学生'
print(str2)
info=re.split("\\\\",str2)#
print(info)

方法2:
str2=r'我是\南京\邮电大学的学生'
print(str2)
info=re.split(r"\\",str2)#
print(info)

其中第一个是先在字符串中正则表达,即\\=\,然后\再在正则表达式中正则表达,\代表
例4:\分割

str3=r'我是\\南京\\邮电大学的学生'
print(str3)
info=re.split(r"\\\\",str3)#
print(info)
#结果:['我是', '南京', '邮电大学的学生']

例5:/分割和//分割

str4=r'我是/南京/邮电大学的学生'
print(str4)
info=re.split("/",str4)#
print(info)

str5=r'我是//南京//邮电大学的学生'
info=re.split(r"//",str5)#
print(info)

#结果:['我是', '南京', '邮电大学的学生']
#	 ['我是', '南京', '邮电大学的学生']

可以看出只要不是正则表达式中的特殊字符,不用直接转译。
(3)split()与re.split的区别
split()为取固定分割符进行分割,不支持正则表达式,而re.split用正则表达式进行分割。

总结:
①字符串前加r代表这个字符串中每个字符都是独立的不含正则表达式
比如:print(r"你好 \n") 结果:你好 \n,即\n也是字符串
②python中\代表转译的意思,代表将后面的特殊字符变为字符串,这里要格外注意,正则表达式中也会有\这个特殊符号
二、正则表达式
1、正则表达式是指用特定的格式去匹配字符串

字符    功能
.       匹配任意1个字符(除了\n)
[]      匹配[ ]中列举的单个字符
\d      匹配数字,也就是0-9
\D      匹配非数字,也就是匹配不是数字的字符
\s      匹配空白符,也就是空格\tab
\S      匹配非空白符,\s取反
\w      陪陪单词字符, a-z, A-Z, 0-9, _
\W      匹配非单词字符, \w取反

2、

字符    功能
*       匹配前一个字符出现0次多次或者无限次,可有可无,可多可少
+       匹配前一个字符出现1次多次或则无限次,直到出现一次
?       匹配前一个字符出现1次或者0次,要么有1次,要么没有
{m}     匹配前一个字符出现m次
{m,}    匹配前一个字符至少出现m次
{m,n}   匹配前一个字符出现m到n次

例1:以\对字符串进行分割

三、%的使用
1、取余操作
python中%为取余的操作。
比如:

5%3
输出:2

代表5除以3余2
2、字符串操作符
%的字符串操作符的语法为:

%[flags] [width].[precision] typecode

(name)为命名
flags可以有+-' '0+表示右对齐。-表示左对齐。' '为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0表示使用0填充。
width表示显示宽度
precision表示小数点后精度
后面再加%使用字符串

以下是类型码
%s    字符串 (采用str()的显示)
%r    字符串 (采用repr()的显示)
%c    单个字符
%b    二进制整数
%d    十进制整数
%i    十进制整数
%o    八进制整数
%x    十六进制整数
%e    以e的科学计数法表示
%E    以E的科学计数法表示
%f    浮点数
%F    浮点数,与上相同%g    指数(e)或浮点数 (根据显示长度)
%G    指数(E)或浮点数 (根据显示长度)
%%    字符"%"

(1)%s,%r的用法

name='彭闯'
print('我叫%s'%name)
print('我叫%r'%name)

我叫彭闯
我叫’彭闯’
(2)%c的用法

name='彭'
print('我叫%c'%name)

我叫彭
(3)将输入的数转换为制定的位数的字符串

#进制表示方式
二进制: 0b             
八进制: 0
十六进制: 0x
#age为16进制数字
age=0x20
#八进制
print('我今年%o岁'%age)
我今年40#十进制
print('我今年%d岁'%age)
我今年32#十进制
print('我今年%i岁'%age)
我今年32#十六进制
print('我今年%x岁'%age)
我今年20

(4) $e,%E用法

num=2
print('%e'%num)
print('%E'%num)

2.000000e+00
2.000000E+00
(5)浮点数的表示

price=16
print("这碗面%.2f"%price)

这碗面16.00

price=16
#占用7个宽度,2位精确度
print("这碗面%7.2f"%price)
这碗面  16.00
```py
#用空格填充
price=16
print("这碗面%  7.2f"%price)
#左对齐
price=16
print("这碗面%+7.2f"%price)
#右对齐
price=16
print("这碗面%-7.2f"%price)
#用0填充
price=16
print("这碗面%07.2f"%price)

这碗面 16.00
这碗面 +16.00
这碗面16.00
这碗面0016.00
(6) 替换多个值

"%s %d %f"%("abc",123,3.21)#多个值
'abc 123 3.210000'

(7) 转译%,如果字符串中含有%怎么办。这时可以采取百分号转译的方式来进行
比如

<1>
num=17
print("今年公司的利润上升了%s%%"%num)
<2>
num=17
print("今年公司的利润上升了%s%%%%"%num)

今年公司的利润上升了17%
今年公司的利润上升了17%%
解析:%本来就是一个特殊字符进行书写时要进行转译,转译用%进行,如果有两个%则用两个转译符%。

猜你喜欢

转载自blog.csdn.net/weixin_41611045/article/details/95722512