1、字符串常规操作
1.1、拼接字符串
使用“+”号可以实现多个字符串的拼接,并产生一个字符串对象。
如
a = "123"
print(a+"1234")
1.2计算字符串长度
使用len()函数
如
str ="123a,时候"
print(len(str))
输出
7
可以看出在len函数计算字符串的长度时,不区分数字,英文,汉字,所有字符都认为是一个字节
但是,如果采用UTF-8编码,汉字占3个字节,采用GBK或者GB2312编码时,汉字占2个字节
如
str ="123a,时候"
print(len(str.encode())) #utf-8编码
print(len(str.encode(gbk))) #gbk编码
输出
15
12
1.3、截取字符串
通过切片方法实现
语法格式如下
string(start : end : step)
如
str = "你就是个啊哈"
str1 = str[1] #截取第二个字符
str1 = str[2:] #从第3个字符开始截取
str2 = str[:2] #从左边开始截取2个字符
str3 = str[2:4] #截取第3个到第4个字符
1.4、分隔字符串
使用split函数分隔
语法格式
str.split(sep,maxsplit)
说明
1、str:表示进行分隔的字符串
2、sep表示指定的分隔符,可以包含多个指定字符,如果不指定,那么默认为None,即所有的空字符(包括空格,\n等等)
3、maxsplit:可选参数,用于指定分隔的次数,如果不指定或者为-1,分隔次数没有限制,否则返回的元素最多为maxsplit+1。
4、如果不指定sep,也不能指定maxsplit
5、返回值为字符串列表
1.5、检索字符串
1、count方法
count()方法检索字符串在另一个字符串中出现的次数。如果字符串不存在返回0,否则返回次数,其语法格式如下。
str.count(sub[,start[,end]])
说明:
str表示原字符串
sub表示要检索的字符串
start表示可选参数,检索的起始位置,若不指定,从头检索
end,与start相似。
2、find方法
检索是否包含指定的字符串,如果检索的字符串不存在则,返回-1,否则返回该字符串首次出现的索引
语法格式
str.find(sub[,start[,end]])
3、index()方法
与find()方法类似,不过使用index()方法,当指定的字符串不存在时抛出异常
语法格式
str.index(sub[,start[,end]])
4、startwith()方法
检测是否以指定字符串开头,是返回True,不是返回False
语法格式:
str.startswith(prefix[,start[,end]])
参数说明,str表示原字符串,prefix表示要检索的字符串
其他参数说明与find()方法类似
5、endwith()方法
检测是否以指定字符串结尾,是返回True,不是返回False
语法格式
str.endswith(suffix[,start[,end]])
1.6、字母的大小写转换
1、lower()方法
将字符串中的全部的大写字母转化为小写字母。
语法格式:
str.lower()
2、upper()方法
将字符串中的全部的小写字母转化为大写字母。
语法格式:
str.upper()
3、swapcase()方法
同时将字符串中的全部的小写字母转化为大写字母,全部的大写字母转化为小写字母。
str.swapcase()
1.7、去除字符串中的空格和特殊字符
特殊字符在这里指的是:\t \r \n(制表、回车、换行)
1、strip()方法
去除字符串的左右两侧的空格和特殊字符
语法格式
str.strip([chars])
如
str1 = " 12323 \n"
print("原字符串str1:" + str1)
print("字符串:" + str1.strip() + ".") # 去除首尾的空格和特殊字符
str2 = "#133#."
print("原字符串str2:" + str2)
print("字符串:" + str2.strip('#.')) #去除首位的#或者.
输出
原字符串str1: 12323
字符串:12323.
原字符串str2:#133#.
字符串:133
2、lstrip()方法
lstrip()方法可以去除字符串左侧的空格和特殊字符,
语法格式
str.lstrip([chars])
3、rstrip()方法
rstrip()方法可以去除字符串由右侧的空格和特殊字符,
语法格式
str.rstrip([chars])
1.8、格式化字符串
格式化字符串就是先定义一个模板,然后在模板中留几个空位,空位用占位符来标记
1、使用%号操作符(逐渐没落)
常用的格式化字符
| 格式化字符 | 说明 | 格式化字符 | 说明 |
| ———- | ——————— | ———- | ———————- |
| %s | 字符串(采用str显示) | %r | 字符串(采用repr显示) |
| %c | 单个字符 | %o | 八进制整数 |
| %d或者%i | 十进制整数 | %e | 指数(基地写为e) |
| %x | 16进制整数 | %E | 指数(基地写为E) |
| %f或者%F | 浮点数 | %% | 字符% |
如
a = "小明为莆田%d中学生,学号为%d,同学都叫他%s" # 定义模板
b1 = (6, 31111111, '小明') # 定义与转化的内容
print(a % b1) # 格式化输出
输出
小明为莆田6中学生,学号为31111111,同学都叫他小明
2、使用字符串对象的format()方法(推荐使用)
语法格式
str.format(args)
args用于指定与转化的项
format()方法中常用的格式化字符
| s | 对字符串类型进行格式化 |
| ——– | ——————————————- |
| b | 将十进制数自动转换成二进制数表示再格式化 |
| d | 十进制整数 |
| o | 将十进制数自动转换成八进制数表示再格式化 |
| c | 将十进制数自动转换成对应的unicode字符 |
| x 或者 X | 将十进制数自动转换成十六进制数表示再格式化 |
| e或者E | 转化为科学计数法表示再格式化 |
| f或者F | 转化为浮点数(默认小数点后保留6位)再格式化 |
| g或者G | 自动在e和f或者E和F中切换 |
| % | 显示百分比(默认小数点后保留6位) |
如
a = "小明为莆田{:d}中学生,学号为{:0>7d},同学都叫他{:s}" # 定义模板
b1 = a.format(6, 31111111, '小明') # 定义与转化的内容
print(b1) # 格式化输出
输出
小明为莆田6中学生,学号为31111111,同学都叫他小明
2、正则表达式基础
2.1、行定位符
行定位符就是用来描述字符串的边界。“^”表示行的开始,“$”表示行的结尾
如
^tm$
2.2、常用的元字符
代码 | 说明 | |
---|---|---|
. | 匹配除换行符以外的任意字符 | |
\w | 匹配字母数字、下划线或者汉字 | |
\s | 匹配任意的空格符 | |
\d | 匹配数字 | |
\b | 匹配单词的开始或者结束 | |
^ | 匹配字符串的开始 | |
$ | 匹配字符串的结尾 |
2.3、限定符
如匹配8位QQ号码可以使用下面的方式表示
^\d{8}$
常用的限定符
| 限定符 | 说明 | 举例 |
| —— | ——————————- | ——————————————— |
| ? | 匹配前面的字符零次或者一次 | app?le,该表达式可以匹配apple或者aple |
| + | 匹配前面的字符者一次或多次 | app+le,该表达式可以匹配apple到app….le |
| | 匹配前面的字符者零次或多次 | apple,该表达式可以匹配aple到app….le |
| {n} | 匹配前面的字符者n次 | app{2}le,该表达式可以匹配appple |
| {n,} | 匹配前面的字符者最少n次 | app{2,}le,该表达式可以匹配appple到appp…le |
| {n,m} | 匹配前面的字符者最少n次,最多m次 | app{2,3}le,该表达式可以匹配appple或者apppple |
2.4、字符类
如果匹配没有预定义的元字符的字符集合(比如元音字母a,e,i,o,u)我们可以使用方括号,然后把要匹配的内容写在方括号里,如[aeiou]匹配任何一个元音字母。
[0-9]与\d的效果一样
[a-z0-9A-Z]与\w的效果一样(只考虑英文)
[\u4e00-\u9fa5]匹配给定字符串的任意一个汉字,匹配连续多个汉字[\u4e00-\u9fa5]+
2.5、排除字符
把^放在方括号里就是排除的意思
如
[^a-zA-Z]
该表达式用于匹配一个不是字母的字符串
2.6、选择字符
例子,匹配身份证号码
身份证号码为15位或者18位,如果是15位的全为数字,如果是17位,则最后一位是效验位,为数字或者X(x)
可以使用下面表达式匹配
^\d{15})|(^\d{18}) |(^\d{17} (\d|X|x)$
意思是匹配15位或者18位数字或者17位数字和最后一位是数字或者X或者x
2.7、转义字符
正则表达式中的转义字符也是将特殊字符(“.”、“?”,“\”)变为普通的字符
。如用正则表达式表示127.0.0.1这样格式的IP地址
[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
注意括号在正则表达式也算一个字符
2.8、分组
例子
(thir|four)th
意思是匹配单词thirth或者fourth,如果不使用小括号,就变成了匹配单词thir和fourth
小括号的第二个作用就是分组。
如
(\.[1-9]{1,3}){2},就是对(\.[1-9]{1,3})进行操作
2.9、在python中使用正则表达式语法
在Python中使用正则表达式就是将其作为模式字符串使用的。
将匹配以m开头的正则表达式转化为模式字符串
'\\bm\\w*\\b'
因为模式字符串可能包含大量的特殊字符和斜杠,所以需要使用原生字符串
就是在模式字符串前加上r或者R.
如
r ‘\bm\w*\b’
3、使用re模块实现正则表达式操作
3.1、匹配字符串
1.使用match()方法进行匹配
如果在其实位置匹配成功,则返回Match对象,否则返回None,其语法格式如下:
re.match(pattern,string,[flags])
说明
pattern:表示模式字符串,由要匹配的正则表达式转换而来
string:表示要匹配的字符串
flags:可选参数,表示标识位,用于控制匹配方式,如是否区分字母大小写。
常用的标志如下表所示
| 标志 | 说明 |
| ————- | ———————————————————— |
| A或ASCII | 对\w、\W、\b、\B、\d、\D、\s、\S只进行ASCII匹配(只适用Python3.x) |
| I或ICNORECASE | 执行不按字母大小写匹配 |
| M或MULTLINE | 将^和$用于包括整个字符串的开始和结尾的每一行 |
| S或DOTALL | 使用“.”字符匹配所有字符,包括换行符 |
| X或VERBOSE | 忽略模式字符串中为转义的空格和注释 |
如
import re
pattern = r'mr_\w+' # 模式字符串
string = 'MR_SHOP mr_shop' # 要匹配的字符串
match = re.match(pattern, string,re.I) # 匹配字符串不区分大小写
print("匹配值的起始位置:", match.start())
print("匹配值的结束位置:", match.end())
print("匹配位置的元组:", match.span())
print("要匹配的字符串:", match.string)
print("匹配数据", match.group())
输出
匹配值的起始位置: 0
匹配值的结束位置: 7
匹配位置的元组: (0, 7)
要匹配的字符串: MR_SHOP mr_shop
匹配数据 MR_SHOP
2、使用search()方法进行匹配
search()方法用于在整个字符串的搜索第一个匹配的值,如果在匹配成功返回match对象,否则返回None
语法格式
re.search(pattern,string,[flags])
参数说明参考match方法
3、使用findall()方法进行匹配
findall方法主要用于整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功返回包含匹配结构的列表,否则返回空列表。
语法格式
re.findall(pattern,string,[flags])
参数说明参考match方法
如
import re
pattern = r'([1-9]{1,3}(\.[0-9]{1,3}){3})'
str1 = '127.0.0.1 192.168.122.2'
match = re.findall(pattern, str1)
for i in match:
print(i[0])
输出
127.0.0.1
192.168.122.2
3.2、替换字符
使用sub()方法进行字符串替换
语法格式
re.sub(pattern, repl, string, count, flags)
说明
pattern:表示模式字符串
repl:表示替换的字符串
string:表示要被查找替换的原始字符串
count: 可选参数表示模式匹配后替换的最大次数,默认为0表示替换所有的匹配
flags: 可选参数,表示标志位,用于控制匹配方式,如区分大小写等,参考match()方法
例子
import re
pattern = r'1[34578]\d{9}'
string = '中奖号码为:84795643 联系电话为:13611111111'
result = re.sub(pattern, '1xxxxxxxxxx', string)
print(result)
输出
中奖号码为:84795643 联系电话为:1xxxxxxxxxx
3.3、使用正则表达式分隔字符串
split()方法进行分隔字符串,并以列表形式返回
语法格式
re.split(pattern, string, [maxsplit], [flags])
说明
pattern:表示模式字符串
string:表示要匹配的字符串
maxsplit: 可选参数,表示最大的拆分次数
flags: 可选参数,表示标志位,用于控制匹配方式,如区分大小写等,参考match()方法
例子
import re
pattern = r'[?|&]'
url = 'http://www.baidu.com?a=xxx&b=yyyy'
result = re.split(pattern, url)
print(result)
输出
['http://www.baidu.com', 'a=xxx', 'b=yyyy']
4、牛刀小试
4.1、按要求输出字符串
已知字符串word=”aS98hdkHFSWEas754”,.编写一- 个程序,分别实现如下功能:
●请将word字符串中的大写字母改为小写字母,小写字母改为大写字母,
●请将word字符串中的数字取出,并输出成一 一个新的字符串
普通版:
word = "aS98hdkHFSWEas754"
a = ""
b = ""
for i in word:
if 97 <= ord(i) <= 122: # 小写字母变大写
a = a + i.upper()
elif 65 <= ord(i) <= 90: # 大写字母变小写
a = a + i.lower()
else:
a = a + i # 数字不变
b = b + i # 数字取出,组成新的字符串
word = a
print(word)
print(b)
升级版:
word = "aS98hdkHFSWEas754"
word = word.swapcase() # word字符串中的大写字母改为小写字母,小写字母改为大写字母
b = ""
for i in word:
if '0'<=i <='9':
b = b + i # 数字取出,组成一个新的字符串
print(word)
print(b)
4.2、输出生日信息
张三的身份证号码是“210011196809210451”.请提取张三的生日信息并输出。
前置知识,身份证的第七位到第14位是出生日期,11位到14位是生日
number = "210011196809210451"
birthday = '张三的生日为:{:s}月{:s}日' # 定义模块化字符串
print(birthday.format(number[10:12], number[12:14])) # 使用format方法输出张三生日
4.3、不重复字母
已知字符串word=”ABDPISDNGDA”.请去除word字符串多次出现的字母,仅留最先出现的一个。例如aabc经过去除后,输出abc。
b =""
word="ABDPISDNGDA"
for i in word:
if i not in b:
b += i
print(b)
4.4、英文句子倒叙输出
将一句英文句于单词顺序留序输出,但是不改变单词结构。例如: 1 am a beautiful ginl,输出为girl beautiful a am I
a = input("请输入英文句子:")
b = a.split() # 将字符串按空格分开,生产一个列表
c = ""
for index, item in enumerate(b): # 利用索引倒叙输出列表的值,并拼接为字符串
c = c + b[-1 - index] + " "
print(c)
输出
请输入英文句子:You are a beautiful girl
girl beautiful a are You