Python零基础入门

Posted Geek_bao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python零基础入门相关的知识,希望对你有一定的参考价值。

五、字符串与正则表达式

字符串几乎是所有编程语言在项目开发过程中涉及最多的一块内容。大部分项目的运行结果,都需要以文本的形式展示给客户,比如财务系统的总账报表,火车站的列车时刻表等。这些都是经过程序精密的计算、判断和梳理,将我们想要的内容用文本形式直观地展示出来。下面我们将重点介绍如果操作字符串和正则表达式的应用。

5.1 字符串常用操作

(1)拼接字符串
使用“+”运算符可完成对多个字符串的拼接,“+”运算符可以连接多个字符串并产生一个字符串对象。代码示例如下:

chinese = "汉语"
english = "English"
print(chinese + '--' + english)

输出结果如下:
在这里插入图片描述
注意:字符串不允许直接与其他类型的数据拼接,示例代码如下:

str1 = '今天我一共花了'
money = 88
str2 = '元'
print(str1 + num + str2)

输出结果如下:

在这里插入图片描述

上述问题的解决办法:可以将整数转化为字符串,可以使用str()函数实现,修改后如下,

str1 = '今天我一共花了'
money = 88
str2 = '元'
print(str1 + str(money) + str2)

最后输出如下:
在这里插入图片描述
(2)计算字符串的长度
由于不同的字符所占字节数不同,所以要计算字符串的长度,需要先了解各字符所占的字节数。在Python中,数字、英文、小数点、下划线和空格占一个字节;一个汉字可能会占2-4个字节,占几个字节取决于采用的编码。汉字在GBK/GB2312编码中占2个字节,在UTF-8/Unicode中一般占用3个字节(或4个字节)。下面以Python默认的UTF-8编码为例进行说明,即一个汉字占3个字节。在Python中,提供了len()函数计算字符串的长度,语法格式如下:

len(string)
string:用于指定要进行长度统计的字符串

代码示例如下:

str1 = '今天我一共花了88个W'
print(len(str1))

代码执行后输出结果为11。从执行结果可以看出,在默认情况下,通过len()函数计算字符串的长度时,不区分英文、数字和汉字,所有字符都认为是一个。
在实际开发中,有时需要获取字符串实际所占的字节数,即如果采用UTF-8编码,汉字占3个字节,采用GBK或者GB2312时,汉字占2个字节。这时,可以通过encode()方法进行编码后再进行获取。代码示例如下:

str1 = '今天我一共花了88个W'

print(len(str1.encode()))

代码执行后输出结果为27。因为8个汉字占24个字节,英文和数字占3个字节,总共27个字节。如果想要获取GBK编码的字符串长度,代码如下:

str1 = '今天我一共花了88个W'
print(len(str1.encode('gbk')))

代码执行后,输出结果为19。

(3)截取字符串
由于字符串也属于序列,所以要截取字符串,可以采用切片方法实现。通过切片截取字符串语法格式如下:

string[start : end : step]
string:表示要截取的字符串
start:表示要截取的第一个字符的索引(包括该字符),如果不指定,默认为0。
end:表示要截取的最后一个字符的索引(不包括该字符),如果不指定则默认为该字符串的长度。
step:表示切片的步长,如果省略,则默认为1,当省略该步长时,最后一个冒号也可以省略

说明:字符串的索引同序列的索引是一样的,也是从0开始,并且每个字符占一个位置。代码示例如下:

str1 = '今天我一共花了88个W'
substr1 = str1[1]
substr2 = str1[5:]
substr3 = str1[:5]
substr4 = str1[2:5]
print('原字符:', str1)
print(substr1 + '\\n' + substr2 + '\\n' + substr3 + '\\n' + substr4)

运行结果如下:
在这里插入图片描述

(4)分割字符串

在Python中,字符串对象提供了分割字符串的方法。分割字符串是把字符串分割为列表,分割字符串可以看做是互逆操作。字符串对象的split()方法可以实现字符串分割,也就是把一个字符串按照指定的分隔符切分为字符串列表,该列表的元素中,不包括分隔符。split()方法的语法格式如下:

str.split(sep, maxsplit)
str:表示要进行分割的字符串
sep:用于指定分隔符,可以包含多个字符,默认为None,即所有空字符(包括空格、换行“\\n”、制表符“\\t”等)
maxsplit:可选参数,用于指定分割的次数,如果不指定或者为-1,则分割次数没有限制,否则返回结果列表的元素个数最多为maxsplit+1。
返回值:分隔后的字符串列表

注意:在split()方法中如果不指定sep参数,那么也不能指定maxsplit参数。
示例代码如下:

str1 = '电 子 科 技 大 学 官 网 >>> www.uestc.edu.cn'
print('原字符串:', str1)
list1 = str1.split()  # 采用默认分隔符进行分割4
list2 = str1.split('>>>')
list3 = str1.split('.')
list4 = str1.split(' ', 4)
print(str(list1) + '\\n' + str(list2) + '\\n' + str(list3) + '\\n' + str(list4))
list5 = str1.split('>')
print(list5)

运行结果如下:
在这里插入图片描述
说明:在使用split()方法时,如果不指定参数,默认采用空白符进行分割,这时无论有几个空格或者空白符都将作为一个分隔符进行分割。

(5)检索字符串
在Python中,字符串对象提供了很多应用于字符串查找的方法,下面开始介绍几种方法。

  1. count()方法
    count()方法用于检索指定字符串在另一个字符串中出现的次数。如果检索的字符串不存在,则返回0,否则返回出现的次数。语法格式如下:
str.count(sub[, start[, end]])
str:表示原字符串。
sub:表示要检索的子字符串。
start:可选参数,表示检索范围的起始位置的索引,如果不指定则从头开始。
end:可选参数,表示检索范围的结束位置的索引,如果不指定,则一直检索到结尾。

示例代码如下:

str1 = '@电子科技大学官网 @四川大学 @四川师范大学'
print('字符串”', str1, '“中包括', str1.count('@'), '个@符号')

示例代码如下:
在这里插入图片描述

  1. find()方法

该方法用于检索是否包含指定的子字符串。如果检测的字符串不存在,则返回-1,否则返回首次出现该子字符串时的索引。语法格式如下:

str.find(sub[, start[, end])
str:表示原字符串。
sub:表示要检索的子字符串。
start:可选参数,表示检索范围的起始位置的索引,如果不指定则从头开始检索。
end:可选参数,表示检索范围的结束位置的索引,如果不指定,则一直检索到结尾。

代码示例如下:

str1 = '@电子科技大学官网 @四川大学 @四川师范大学'
print('字符串”', str1, '“中首次出现@的索引位置为:', str1.find('@'))

运行结果如下:
在这里插入图片描述
说明:如果只是想要判断指定字符串是否存在,可以使用in关键字实现。如,str1中是否存在@符号,可以使用“print(’@’ in str1)”,如果存在就返回True、否则返回False。另外也可以根据find()方法的返回值是否大于-1来判断指定的字符串是否存在。

注意:如果输入的子字符串在原字符串中不存在,将返回-1,。此外Python的字符串对象还提供了rfind()方法,其作用与find()方法类似,只是从右边开始查找。

  1. index()方法
    index()方法同find()方法类似,也是用于检索是否包含指定的子字符串。只不过如果使用index()方法,当指定的字符串不存在时会抛出异常。语法格式如下:
str.index(sub[, start[, end]])
str:表示原字符串。
sub:表示要检索的子字符串。
start:可选参数,表示检索范围的起始位置的索引,如果不指定则从头开始检索。
end:可选参数,表示检索范围的结束位置的索引,如果不指定,则一直检索到结尾。

示例代码如下:

str1 = '@电子科技大学官网 @四川大学 @四川师范大学'
print('字符串”', str1, '“中首次出现@的索引位置为:', str1.index('@'))

输出结果同上。

说明:Python的字符串对象还提供了rindex()方法,其作用与index()方法类似,只是从右边开始查找。

  1. startswith()方法
    该方法用于检索字符串是否以指定字符串开头。如果是则返回True,否则返回False。语法格式如下:
str.starstwith(prefix[, start[, end]])
str:表示原字符串。
prefix:表示要检索的子字符串。
start:可选参数,表示检索范围的起始位置的索引,如果不指定则从头开始检索。
end:可选参数,表示检索范围的结束位置的索引,如果不指定,则一直检索到结尾。

示例代码如下:

str1 = '@电子科技大学官网 @四川大学 @四川师范大学'
print('字符串”', str1, '“中是否以@符号开头:', str1.startswith('@'))

代码执行后输出结果为,True。

  1. endwith()方法
    该方法用于检索字符串是否以指定子字符串结尾。果是则返回True,否则返回False。语法格式如下:
str.endswith(suffix[, start[, end]])
str:表示原字符串。
prefix:表示要检索的子字符串。
start:可选参数,表示检索范围的起始位置的索引,如果不指定则从头开始检索。
end:可选参数,表示检索范围的结束位置的索引,如果不指定,则一直检索到结尾。

示例代码如下:

str.endswith(suffix[, start[, end]])
str:表示原字符串。
prefix:表示要检索的子字符串。
start:可选参数,表示检索范围的起始位置的索引,如果不指定则从头开始检索。
end:可选参数,表示检索范围的结束位置的索引,如果不指定,则一直检索到结尾。

(6)字母的大小写转换
在Python中,字符串对象提供了lower()方法和upper()方法进行字母的大小写转换,即可用于将大小写字母转换为小写字母或者将小写字母修改为大写字母。示意图如下:
在这里插入图片描述

  1. lower()方法
    lower方法用于将字符串中的大写字母转换为小写字母。如果字符串中没有需要被转换的字符,则将原字符串返回;否则将返回一个新的字符串,将原字符串中每个需要进行小写转换的字符都转换成等价的小写字符。字符长度与原字符长度相同。语法格式如下:
str.lower()
str:表示要进行转换的字符串

示例代码如下:

str1 = ' http://WWW.UESTC.edu.com'
print('原字符串:', str1)
print('新字符串:', str1.lower())

输出结果如下:
在这里插入图片描述

  1. upper()方法
    upper()方法用于将字符串中的小写字母转换为大写字母。如果字符串中没有需要被转换的字符,则将原字符串返回;否则将返回一个新的字符串,将原字符串中每个需要进行大写转换的字符都转换成等价的大写字符。字符长度与原字符长度相同。语法格式如下:
str.upper()
str:表示要进行转换的字符串

示例代码如下:

str1 = ' http://WWW.UESTC.edu.com'
print('原字符串:', str1)
print('新字符串:', str1.upper())

输出结果如下:
在这里插入图片描述

(7)去除字符串中的空格和特殊字符
用户在输入数据时,可能会无意中输入多余的空格,或在一些情况下,字符串前后不允许出现空格和特殊字符,此时就需要去除字符串中的空格和特殊字符。下面介绍几种方法。

  1. strip()方法
    strip()方法用于去掉字符串左、右两侧的空格和特殊字符,语法格式如下:
str.strip([chars])
其中,str为要去除空格的字符串;
chars为可选参数,用于指定要去除的字符,可以指定多个,如果设置chars为“@.,则去除左右两侧包括“@”或“.”。如果不指定参数,默认将去除空格、制表符“\\t”,回车符“\\r”、换行符“\\n”等。

示例代码如下:

str1 = ' http://www.uestc.edu.com  \\t\\n\\r'
print('原字符串str1:' + str1 + '。')
print('字符串:' + str1.strip() + '。')
str2 = '@电子科技大学.@.'
print('原字符串str2:' + str2 + '。')
print('字符串:' + str2.strip('@.') + '。')

运行结果如下图:
在这里插入图片描述

  1. lstrip()方法
    lstrip()方法用于去掉字符串左侧的空格和特殊字符,语法格式如下:
str.lstrip([chars])
其中,str为要去除空格的字符串;
chars为可选参数,用于指定要去除的字符,可以指定多个,如果设置chars为“@.,则去除左右两侧包括“@”或“.”。如果不指定参数,默认将去除空格、制表符“\\t”,回车符“\\r”、换行符“\\n”等。

代码示例如下:

str1 = '\\t http://www.uestc.edu.com'
print('原字符串str1:' + str1 + '。')
print('字符串:' + str1.lstrip() + '。')
str2 = '@电子科技大学'
print('原字符串str2:' + str2 + '。')
print('字符串:' + str2.lstrip('@') + '。')

运行结果如下:

在这里插入图片描述

  1. rstrip()方法
    rstrip()方法用于去掉字符串右侧的空格和特殊字符,语法格式如下:
str.rstrip([chars])
其中,str为要去除空格的字符串;
chars为可选参数,用于指定要去除的字符,可以指定多个,如果设置chars为“@.,则去除左右两侧包括“@”或“.”。如果不指定参数,默认将去除空格、制表符“\\t”,回车符“\\r”、换行符“\\n”等。

代码示例如下:

str1 = 'http://www.uestc.edu.com  \\t'
print('原字符串str1:' + str1 + '。')
print('字符串:' + str1.rstrip() + '。')
str2 = '电子科技大学,'
print('原字符串str2:' + str2 + '。')
print('字符串:' + str2.rstrip(',') + '。')

运行结果如下图:
在这里插入图片描述

(8)格式化字符串

格式化字符串是指先指定一个模板,在这个模板中预留几个空位,然后再根据需要填上相应的内容。这些空位需要通过指定的符号标记(也称占位符),而这些符号还不会显现出来。在Python中,格式化字符串有以下两种方法。

  1. 使用“%”操作符
    在Python中,要实现格式化字符串,可以使用“%”操作符。语法格式如下:
'%[-][+][0][m][.n]格式化字符'%exp
参数说明:
-:可选参数,用于指定左对齐,正数前方无符号,负数前面加负号。
+:可选参数,用于指定右对齐,正数前方加正号,负数前面加负号。
0:可选参数,表示右对齐,正数前方无符号,负数前方加负号,用0填充空白处(一般与m参数一起使用)。
m:可选参数,表示占有宽度。
.n:可选参数,表示小数点后保留的位数。
格式化字符串:用于指定类型,其值如表所示
exp:要转换的项。如果要指定的项有多个,需要通过元组的形式进行指定,但不能使用列表。

常用的格式化字符:

在这里插入图片描述
示例代码如下:

template = '编号:%09d\\t公司名称:%s \\t官网: http://www.%s.com'    # 定义模板
context1 = (7, '百度', 'baidu')
context2 = (8, '电子科大', 'uestc')
print(template % context1)
print(template % context2)


运行结果如下:
在这里插入图片描述
说明:由于使用%操作符是早期Python中提供的方法,自从Python 2.6版本开始,字符串对象提供了format()方法对字符串进行格式化。现在一些Python社区也推荐使用这种方法。所以建议各位重点学些format()方法的使用。

  1. 字符串对象的format()方法

字符串对象提供了format()方法用于进行字符串格式化,语法格式如下:

str.format(args)
其中,str是指定字符串的显示样式(即模板);
args用于指定要转换的项,如果有多项,则用逗号进行分隔。

在创建模板时,需要使用“{}”和“:”指定占位符,基本语法如下:

{[index][:[[fill]align][sign][#][width][.precision][type]]}
参数说明:
index:可选参数,用于指定要设置格式的对象在参数列表中的索引位置,索引值从0开始。如果省略,则根据值的先后顺序自动分配。
fill:可选参数,用于指定空白处填充的字符
align:可选参数,用于指定对齐方式(值为“<”表示内容左对齐;值为“>”表示内容右对齐;值为“=”表示内容右对齐,将符号放在填充内容的最左侧,且只对数字类型有效;值为“^”表示内容居中),需要配合width一起使用。
sign:可选参数,用于指定有无符号数(值为“+”表示正数加正号,负数加负号;值为“-”表示正数不变,负数加负号;值为空格表示正数加空格,负数加负号。)
#:可选参数,对于二进制、八进制和十六进制数,如果加上#,表示会显示“0b/0o/0x”前缀,否则不显示前缀。
width:可选参数,用于指定所占宽度。
.precision:可选参数,用于指定保留的小数位数。
type:可选参数,用于指定类型,其值如下表;



format()方法中常用的格式化字符:

在这里插入图片描述
说明:当一个模板中出现多个占位符时,指定索引位置的规范需统一,即全部采用手动指定或全部采用自动。否则会报错
下面来看看示例代码:

template = '编号:{:0>9s}\\t公司名称:{:s} \\t官网: http://www.{:s}.com'
context1 = template.format('7', '百度', 'baidu')
context2 = template.format('8', '电子科大', 'uestc')
print(context1)
print(context2)

运行结果如下:
在这里插入图片描述

在实际开发中,数值类型有多种显示方式,比如货币形式、百分比形式等,使用format()方法可以将数值格式转化为不同的形式。

5.2 正则表达式基础

在处理字符串时,经常会有查找符合某些复杂规则的字符串的要求。正则表达式就是用于描述这些规则的巩固。换句话说,正则表达式就是记录文本规则的代码。对于接触过DOS的用户来说,如果想匹配当前文件夹下所有的文本文件,可以输入“dir .txt”命令,按键后,所有“.txt”文件将会被列出来。这里的“.txt”即可以理解为一个简单的正则表达式。

(1)行定位符
行定位符就是用来描述子串的边界。“^”表示行的开始;“$”表示行的结尾。如:

^tm
该表达式表示要匹配子串tm的开始位置是行头,如“tm equal Tomorrow Moon”就可以匹配,而“Tomorrow Moon equal tm”就比不匹配。但如果使用:
tm$
就可以匹配。如果要匹配的子串可以出现在字符串的任意部分,那么可以直接写成:
tm
这样前面两个表达式都可匹配。

(2)元字符
除了前面介绍的元字符“^”和“$”外,正则表达式里还有更多的元字符,例如下面的正则表达式就应用了元字符“\\b”和“\\w”。

\\bcs\\w*\\b

上面的正则表达式用于匹配以字母cs开头的单词,先从某个单词开始处(\\b),然后匹配字母cs,接着是任意数量的字母或数字(\\w*),最后是单词结束处(\\b)。该表达式可以匹配“csbao”“csgeek”和“cs1024”等等,但是不能与“acs”匹配。
常用元字符如下表:
在这里插入图片描述

(3)限定符
上面例子中,使用(\\w*)匹配任意数量的字母或数字。如果想匹配特定数量的数字,该如何表示呢?正则表达式为我们提供了限定符(指定数量的字符)来实现该功能。如匹配8位QQ号可用如下表达式:

^\\d{8}$

常见限定符如下:

在这里插入图片描述

(4)字符类
正则表达式查找数字和字母是很简单的,因为已经有了对应这些字符集合的元字符(如“\\d”,“\\w”),但是如果要匹配没有预定义元字符的字符集合(如元音字母a,e,i,o,u),应该怎么办?
很简单,只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(“.”“?”“!”)。也可以轻松地指定一个字符范围,像“[0-9]”代表的含义与“\\d”就是完全一致的:一位数字;同理“[a-z0-9A-Z]”也完全等同于“\\w”(如果只考虑英文的话)

说明:要想匹配给定字符串中任意一个汉字,可以使用“[\\u4e00-\\u9fa5]”;如果要匹配连续多个汉字,可以使用“[\\u4e00-\\u9fa5]+”

(5)排除字符
在上节中列出的是匹配符合指定字符集合的字符串。现在反过来,匹配不符合指定字符集合的字符串。正则表达式提供了“^”字符。这个元字符在前面小节也出现过,表示行的开始。而这里将会放到方括号中,表示排除的意思。例如:

[^a-zA-Z]
该表达式表示用于匹配一个不是字母的字符。

(6)选择字符
考虑一个问题,如何匹配身份证号码?首先需要了解一下身份证号码的规则。身份证号码长度为15位或者18位。如果为15位时,全为数字;如果为18位时,则前17位为数字,最后一位是校验位,可能为数字或者字符X。
在上面的描述中,包含着条件选择的逻辑,这就需要使用选择字符(|)来实现。该字符可以理解为“或”,匹配身份证的表达式可以写成如下方式;

(^\\d{15}$)|(^\\d{18}$)|(^\\d{17})(\\d|X|x)$
该表达式的意思是匹配15位数字,或者18位数字,或者17位数字和最后一位。最后一位可以是数字或者X或者x。

(7)转义字符
正则表达式的转义字符(\\)和Python中的大同小异,都是特殊字符(如“.”“?”“!”等)变为普通字符。举一个IP地址的例子,用正则表达式匹配诸如“127.0.0.1”这样格式的IP地址。如果直接使用点字符,格式为:

[1-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}

这显然不对,因为“.”可以匹配一个任意字符。这时,不仅是“127.0.0.1”这样的IP,连“127101011”这样的字串也会被匹配出来。所以在使用“.”时,需要使用转义字符(\\)。修改后上面的正则表达式格式为:

[1-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}

说明:括号在正则表达式中也算是一个元字符。

(8)分组
通过前面的学习,大家对于小括号作用有一定的了解。小括号字符的第一个作用就是可以改变限定符的作用范围,如“|” “*” “^”等。如下表达式:

(six|four)th
这个表达式的意思是匹配单词sixth和fourth,如果不使用小括号,那么就变成了匹配单词six和fourth了。

小括号的第二个作用是分组,也就是子表达式。如(.[0-9]{1,3}){3},就是对分组(.[0-9]{1,3})进行重复操作。

(9)在Python中使用正则表达式语法
在Python中使用正则表达式时,是将其作为模式字符串使用的。例如,将匹配不是字母的一个字符的正则表达式表示为模式字符串,可以使用下面的代码:

'[^a-zA-Z]'

而如果将匹配以字母m开头的单词的正则表达式转换为模式字符串,则不能直接在其两侧添加引号定界符,例如下面代码就不正确。

'\\bm\\w*\\b'

应该把其中的“\\”进行转义,转换后的结果为:

'\\\\bm\\\\w*\\\\b'

由于模式字符串中可能包括大量的特殊字符和反斜杠,所以需要写为原生字符串,即在模式字符串前加r或者R。例如,上面的模式字符串采用原生字符串表示就是:

r'\\bm\\w*\\b'

说明:在编写模式字符串时,并不是所有的反斜杠都需要进行转换,例如,前面编写的正则表达式“^\\d{8}$”中反斜杠就不需要转义,因为其中的“\\d”并没有特殊意义。不过,为了编写方便,本文中的正则表达式都采用原生字符串表示。

5.3 使用re模块实现正则表达式操作

Python提供了re模块,用于实现正则表达式的操作。在实现时,可以使用re模块提供的方法(如,search(),match(),findall()等)进行字符串处理,也可以先使用re模块的compile()方法将模式字符串转换为正则表达式对象,然后再使用该正则表达式对象的相关方法来操作字符串。
re模块在使用时,需要先应用import语句引入,具体代码如下:

import re

如果在使用re模块时,未将其引入,则会出现异常。

(1)匹配字符串

  1. 使用match()方法进行匹配
    match()方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回Match对象,否则返回None,语法格式如下:
re.match(pattern, string, [flags])
参数说明:
pattern:表示模式字符串,由要匹配的正则表达式转换而来。
string:表示要匹配的字符串
flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。常用的标志如下表

在这里插入图片描述
下面来看一个例子,匹配字符串是否以“mr_”开头,代

以上是关于Python零基础入门的主要内容,如果未能解决你的问题,请参考以下文章

零基础python入门书籍推荐读哪些书?

零基础python入门书籍推荐读哪些书?

零基础python入门书籍推荐读哪些书?

《Python3.6零基础入门与实战》

零基础入门学习Python

Python 异常处理-Python零基础入门教程