系列文章目录
个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页
Python入门专栏:《Python入门》欢迎阅读,一起进步!🌟🌟🌟
码字不易,如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!😊😊😊
文章目录
导语
欢迎来到本系列教程的第六篇,之前的文章已经介绍了基本的输入和输出,变量、数据类型和操作符,列表和元组,本章将重点介绍如何操作字符串和正则表达式的应用。字符串几乎是所有编程语言在项目开发过程中涉及最多的一块内容,而正则表达式则是处理和匹配字符串的强大工具。在本篇博客中,我们将一步步介绍字符串的常用操作,然后深入探讨正则表达式的基本语法和在 Python 中的应用。
字符串常用操作
拼接字符串
拼接字符串是将多个字符串连接成一个字符串的操作。在Python中,我们可以使用加号(+)或者字符串对象的 join()
方法来实现字符串的拼接。例如:
mot_en = 'Remember is a form of meeting,Frgetfulness is a form of freedom.'
mot_cn = '记忆是一种相遇,遗忘是一种自由。'
print(mot_en+'——'+mot_cn)
str_list = ['Hello','world'] # 字符串对象有个 join() 方法,接收的参数是一个由字符串组成的可迭代对象
print(' '.join(str_list)) # 连接符是一个空格
输出结果为:
Remember is a form of meeting,Frgetfulness is a form of freedom.——记忆是一种相遇,遗忘是一种自由。
Hello world
计算字符串的长度
计算字符串的长度是获取字符串中字符个数的操作。在 Python 中,可以使用 len()
函数来获得字符串的长度。例如:
str1 = '人生苦短,我用Python!'
length1 = len(str1) # 计算字符串长度
print(length1)
输出结果为:
14
从上面的结果中可以看出,在默认的情况下,通过 len()
函数计算字符串的长度时,不区分英文、数字和汉字,所有字符都认为是一个。在实际开发时,有时需要获取字符串实际所占的字节数,即如果采用 UTF-8 编码,汉字占 3 个字节,采用 GBK 或者 GB2312 时,汉字占 2 个字节。这时,可以通过使用 encode()
方法进行编码后再进行获取。例如,如果要获取采用 UTF-8 或者 GBK 编码的字符串的长度,可以使用下面的代码:
str1 = '人生苦短,我用Python!'
length2 = len(str1.encode()) # 计算 UTF-8 编码的字符串长度
print(length2)
length3 = len(str1.encode('gbk')) # 计算 GBK 编码的字符串长度
print(length3)
输出结果为:
28
21
截取字符串
截取字符串是从一个字符串中提取出部分内容的操作。在 Python 中,可以使用切片来截取字符串。切片使用方括号和索引来指定要截取的范围。例如:
str = "Hello World"
sub_str = str[6:11]
print(sub_str)
输出结果为:
World
分割字符串
分割字符串是将一个字符串按照特定的分隔符拆分成多个子串的操作。在 Python 中,可以使用 split()
函数来实现字符串的分割。例如:
str2 = '机 电 研 究 生 >>> blog.csdn.net/a2360051431'
list1 = str2.split() # 采用默认分隔符进行分割
list2 = str2.split('>>>') # 采用多个字符进行分割
list3 = str2.split('.') # 采用"."进行分割
list4 = str2.split(' ',4) # 采用空格进行分割,并且只分割前四个
print(str(list1)+'\n'+str(list2)+'\n'+str(list3)+'\n'+str(list4))
list5 = str2.split('>') # 采用 ">" 进行分割
print(list5)
输出结果为:
['机', '电', '研', '究', '生', '>>>', 'blog.csdn.net/a2360051431']
['机 电 研 究 生 ', ' blog.csdn.net/a2360051431']
['机 电 研 究 生 >>> blog', 'csdn', 'net/a2360051431']
['机', '电', '研', '究', '生 >>> blog.csdn.net/a2360051431']
['机 电 研 究 生 ', '', '', ' blog.csdn.net/a2360051431']
在使用
split()
方法时,如果不指定参数,默认采用空白符进行分割,这时无论有几个空格或者空白符都将作为一个分隔符进行分割。例如,上面示例中, 在 “生” 和 “>” 之间有两个空格,但是分割结果(第一行内容)中已经被全部过滤掉了。但是,如果指定一个分隔符,那么当这个分隔符出现多个时,就会每个分隔一次,没有得到内容的,将产生一个空元素。例如,上面结果中的最后一行,就出现了两个空元素。
检索字符串
检索字符串是在一个字符串中查找指定的子串并返回其位置的操作。在 Python 中,可以使用 count()
方法检索指定字符串在另一个字符串中出现的次数。如果检索的字符串不存在,则返回 0,否则返回出现的次数。可以使用 index()
方法或者 find()
方法来实现字符串的检索。
find()
方法用于检索是否包含指定的子字符串。如果检索的字符串不存在,则返回 -1,否则返回首次出现该子字符串时的索引。
index()
方法同 find()
方法类似,也是用于检索是否包含指定的子字符串。只不过如果使用 index()
方法,当指定的字符串不存在时会抛出异常。
startswith()
方法用于检索字符串是否以指定子字符串开头。如果是则返回 True,否则返回 False。
endswith()
方法用于检索字符串是否以指定子字符串结尾。如果是返回 True,否则返回 False。
str3 = '@FaceBook@扎克伯格@雷军'
print('字符串"',str3,'"中包括',str3.count('@'),'个@符号')
print('字符串"',str3,'"中@符号首次出现的位置索引为:',str3.find('@'))
print('字符串"',str3,'"中@符号首次出现的位置索引为:',str3.index('@')) # find()检索的字符串不存在返回-1,index()则会抛出异常
print('判断字符串"',str3,'"是否以@符号开头,结果为:',str3.startswith('@'))
print('判断字符串"',str3,'"是否以雷军结尾,结果为:',str3.endswith('雷军'))
输出结果为:
字符串" @FaceBook@扎克伯格@雷军 "中包括 3 个@符号
字符串" @FaceBook@扎克伯格@雷军 "中@符号首次出现的位置索引为: 0
字符串" @FaceBook@扎克伯格@雷军 "中@符号首次出现的位置索引为: 0
判断字符串" @FaceBook@扎克伯格@雷军 "是否以@符号开头,结果为: True
判断字符串" @FaceBook@扎克伯格@雷军 "是否以雷军结尾,结果为: True
字母的大小写转换
字母的大小写转换是将字符串中的字母字符转换为大写或小写形式的操作。在 Python 中,可以使用 upper()
函数将字母转换为大写,使用 lower()
函数将字母转换为小写。例如:
str = "Hello World"
upper_str = str.upper()
lower_str = str.lower()
print(upper_str)
print(lower_str)
输出结果为:
HELLO WORLD
hello world
去除字符串中的空格和特殊字符
去除字符串中的空格和特殊字符是清理字符串中不需要的部分的操作。在 Python 中,可以使用 strip()
方法来去除字符串两端的空格和特殊字符,也可以使用 lstrip()
方法去除字符串左边的空格和特殊字符,或使用 rstrip()
方法去除字符串中右边的空格和特殊字符。使用 replace()
函数来替换特定的字符。例如:
str = " Hello World! "
trimmed_str1 = str.strip()
trimmed_str2 = str.strip('! ') # 去除字符串首尾的 "!" " "
trimmed_str3 = str.lstrip()
trimmed_str4 = str.rstrip()
replaced_str = str.replace("!", "")
print(trimmed_str1)
print(trimmed_str2)
print(trimmed_str3)
print(trimmed_str4)
print(replaced_str)
输出结果为:
Hello World!
Hello World
Hello World!
Hello World!
Hello World
格式化字符串
格式化字符串是指先制定一个模板,在这个模板中预留几个空位,然后再根据需要填上相应的内容。这些空位需要通过指定的符号标记(也称为占位符),而这些符号还不会显示出来。在Python中,可以使用占位符(%)、format()
方法、f-string 格式化字符串(更加推荐)和模板字符串来实现字符串的格式化。例如:
-
使用百分号(%)格式化字符串:这是一种传统的格式化字符串的方法,通过在字符串中使用占位符和 % 运算符来表示要插入的变量。例如:
name = "Alice" age = 25 formatted_str = "My name is %s and I'm %d years old." % (name, age) print(formatted_str)
输出结果为:
My name is Alice and I'm 25 years old.
-
使用字符串对象的
format()
方法:这是一种更现代化的格式化字符串的方法,通过在字符串中使用花括号 {} 和format()
方法来表示要插入的变量。例如:name = "Alice" age = 25 formatted_str = "My name is {} and I'm {} years old.".format(name, age) print(formatted_str)
输出结果为:
My name is Alice and I'm 25 years old.
-
使用 f-string(格式化字符串常量):这是 Python 3.6 及更高版本引入的一种简洁而直观的格式化字符串的方法,通过在字符串前加上字母 “f” 并在花括号 {} 中使用变量来表示要插入的值。例如:
name = "Alice" age = 25 formatted_str = f"My name is {name} and I'm {age} years old." print(formatted_str)
输出结果为:
My name is Alice and I'm 25 years old.
-
使用模板字符串:模板字符串是一种更灵活的字符串格式化方法,它使用
string.Template
类和占位符来替换变量。例如:from string import Template name = "Alice" age = 25 template = Template("My name is $name and I'm $age years old.") formatted_str = template.substitute(name=name, age=age) print(formatted_str)
输出结果为:
My name is Alice and I'm 25 years old.
正则表达式基础
在处理字符串时,经常会有查找符合某些复杂规则的字符串的需求。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码,它使用一系列的符号和特殊字符来描述字符串的模式。接下来,让我们了解一些正则表达式的基本概念。
行定位符
行定位符用于匹配字符串的开头和结尾。在正则表达式中,使用 ^
表示字符串的开头,使用 $
表示字符串的结尾。例如:
^tm # 该表达式表示要匹配以 tm 子串开头的字符串
tm$ # 该表达式表示要匹配以 tm 子串结尾的字符串
tm # 该表达式表示要匹配 tm 子串出现在任意部分的字符串
元字符
元字符是正则表达式中具有特殊意义的字符。除了上面的 ^
和 $
外,正则表达式里还有更多的元字符,常见的元字符包括 .
(匹配换行符外的任意字符)、\d
(匹配数字)、\w
(匹配字母、数字、下划线)等。例如:
元字符 | 描述 |
---|---|
. | 匹配除换行符外的任意字符。 |
\w | 匹配字母、数字或下划线。等价于 [a-zA-Z0-9_] 。 |
\d | 匹配数字。等价于 [0-9] 。 |
\s | 匹配空白字符,包括空格、制表符、换行符等。 |
\b | 匹配单词的边界。 |
^ | 匹配字符串的开头。 |
$ | 匹配字符串的结尾。 |
限定符
限定符用于指定匹配的数量。常见的限定符包括 ?
(匹配前面的元素零次或一次)、+
(匹配前面的元素一次或多次)、*
(匹配前面的元素零次或多次)等。例如:
限定符 | 描述 | 举例 |
---|---|---|
? | 匹配前面的元素零次或一次。 | colou?r,该表达式可以匹配 colour 和 color |
+ | 匹配前面的元素一次或多次。 | go+gle,该表达式可以匹配的范围从 gogle 到 goo…gle |
* | 匹配前面的元素零次或多次。 | go*gle,该表达式可以匹配的范围从 ggle 到 goo…gle |
{n} | 匹配前面的元素恰好n次。 | go{2}gle,该表达式只匹配 google |
{n,} | 匹配前面的元素至少n次。 | go{2,}gle,该表达式可以匹配的范围从 google 到goo…gle |
{n,m} | 匹配前面的元素至少n次但不超过m次。 | employe{0,2},该表达式可以匹配 employ、employe 和 employee 3 种情况 |
字符类
字符类用于匹配一组字符中的任意一个。在正则表达式中,可以使用方括号 []
来定义字符类。例如,[abc]
表示匹配字符 a、b 或 c;[aeiou]
就匹配任何一个英文元音字母。
要想匹配给定字符串中任意一个汉字,可以使用
[\u4e00-\u9fa5]
;如果要匹配连续多个汉字,可以使用[\u4e00-u9fa5]+
。
排除字符
排除字符用于匹配不在指定字符类中的字符。在正则表达式中,可以使用脱字符 ^
来表示排除字符,这个元字符在行定位符中出现过,表示行的开始,而这里将会放到方括号中,表示排除的意思。例如,[^0-9]
表示匹配任意非数字字符;[^a-zA-Z]
表示匹配一个不是字母的字符。
选择字符
选择字符用于匹配多个模式中的一个。在正则表达式中,可以使用竖线 |
来表示选择。例如,cat|dog
表示匹配 cat 或 dog。
匹配身份证的表达式可以写成如下方式:
(^\d{15}$)|(^\d{18}$)|(^\d{17})(\d|X|x)$
该表达式的意思是匹配 15 位数字,或者 18 位数字,或者 17 位数字和最后一位。最后一位可以是数字或者是 X 或者是 x。
转义字符
转义字符用于匹配具有特殊意义的字符本身。在正则表达式中,可以使用反斜杠 \
来表示转义字符。例如,\.
表示匹配句点字符。
分组
通过匹配身份证的例子,相信读者已经对小括号的作用有了一定的了解。小括号字符的第一个作用就是可以改变限定符的作用范围,如 ‘|’、‘*’、‘^’ 等。例如下面的表达式中包含小括号。
(six|four)th
这个表达式的意思是匹配单词 sixth 或 fourth,如果不使用小括号,那么就变成了匹配单词 six 和 fourth 了。
小括号的第二个作用是分组,也就是子表达式。如 (.[0-9]{1,3}){3}
,就是对分组 (.[0-9]{1,3})
进行重复操作。
在Python中使用正则表达式语法
在 Python 中使用正则表达式时,是将其作为模式字符串使用的。例如,将匹配不是字母的一个字符的正则表达式表示为模式字符串,可以使用下面的代码:
'[^a-zA-Z]'
而如果将匹配以字母 m 开头的单词的正则表达式转换为模式字符串,则不能直接在其两侧添加引号定界符,例如,下面的代码是不正确的。
'\bm\W*\b'
而是需要将其中的 “\” 进行转义,即在模式字串前加 r 或 R。使用的代码改写为:
r'\bm\W*\b'
使用re模块实现正则表达式操作
Python 提供了 re 模块,用于实现正则表达式的操作。在实现时,可以使用 re 模块提供的方法(例如,match()
、search()
、findall()
等)进行字符串处理。
匹配字符串
匹配字符串可以使用 re 模块提供的 match()
、search()
、findall()
等方法。例如:
import re # re 模块在使用时,需要先应用 import 语句引入
# match 方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回 match 对象,否则返回 None
pattern = r'mr_\w+' # 模式字符串
string = 'MR_SHOP mr_shop' # 要匹配的字符串
match = re.match(pattern,string,re.I) # 匹配字符串,不区分大小写
print(match)
print('匹配值得起始位置:',match.start())
print('匹配值得结束位置:',match.end())
print('匹配位置的元组:',match.span())
print('要匹配的字符串:',match.string)
print('匹配数据:',match.group())
# search 方法用于在整个字符串中搜索第一个匹配的值,如果匹配成功,则返回 match 对象,否则返回 None
match = re.search(pattern,string,re.I)
print(match)
# findall 方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。若匹配成功,则返回包含匹配结构的列表,否则返回空列表
match = re.findall(pattern,string,re.I)
print(match)
输出结果为:
<re.Match object; span=(0, 7), match='MR_SHOP'>
匹配值得起始位置: 0
匹配值得结束位置: 7
匹配位置的元组: (0, 7)
要匹配的字符串: MR_SHOP mr_shop
匹配数据: MR_SHOP
<re.Match object; span=(0, 7), match='MR_SHOP'>
['MR_SHOP', 'mr_shop']
替换字符串
使用 re 模块的 sub()
函数可以替换字符串中匹配某个正则表达式模式的部分。例如:
import re
pattern = r'1[34578]\d{9}' # 定义要替换的模式字符串
string = '中奖号码为:86888888 联系电话为 13111111111'
result = re.sub(pattern,'1XXXXXXXXXXX',string)
print(result)
输出结果为:
中奖号码为:86888888 联系电话为 1XXXXXXXXXXX
使用正则表达式分割字符串
split()
方法用于实现根据正则表达式分割字符串,并以列表的形式返回,其作用与字符串对象的 split()
方法类似,所不同的就是分割字符由模式字符串指定。例如:
import re
pattern = r'[>|/]' # 定义分隔符
ur1 = '机 电 研 究 生 >>> blog.csdn.net/a2360051431'
result = re.split(pattern,ur1) # 其作用与字符串对象的 spilt 方法类型,所不同的就是分割字符由模式字符串指定
print(result)
输出结果为:
['机 电 研 究 生 ', '', '', ' blog.csdn.net', 'a2360051431']
结语
本篇博客我们学习了字符串的常用操作,包括拼接字符串、计算字符串的长度、截取字符串、分割字符串、检索字符串、字母的大小写转换、去除字符串中的空格和特殊字符、格式化字符串。我们还介绍了正则表达式的基础知识,包括行定位符、元字符、限定符、字符类、排除字符、选择字符、转义字符和分组。最后,我们学习了如何使用 re 模块在 Python 中实现正则表达式的操作,包括匹配字符串、替换字符串和分割字符串。
掌握了字符串和正则表达式的基础知识,你将能够更加灵活和高效地处理和操作字符串数据。希望本篇博客对你学习 Python 有所帮助!