09-字符串

字符串

1.字符串

1.什么是字符串

  • 字符串是容器型数据类型:将’‘或者’’’’’‘或者“”“”作为容器标志,引号中的每个元素都是字符串的元素。’’’’’'和“” “”在表示字符串内容的时候换行可以不使用转义字符,而是直接回车。

  • 字符串不可变,不支持增删改

  • 字符串是有序的,支持下标操作

  • 字符串的元素:引号中的单独的每个符号都是字符串的元素(字符),任何元素都可以。

  • 字符串分两大类:普通字符(表示符号本身)、转义字符

    str1 = '90,100'
    str2 = "abc123+=@"
    str3 = "abc\n123"
    str4 = """asc
              123
              asd
    """
    

2.字符串的元素

'''
转义字符:在特定符号前加反斜杠\,让符号具有特殊功能。一个转义字符的长度是1
常见的转义字符
\n	-	换行
\t	-	水平制服表(相当于tab键的功能)
\'	-	表示一个普通的单引号
\"	-	表示一个普通的双引号
\\	-	表示一个普通的反斜杠
'''
# \u4位数的十六进制数	-	编码字符
str5 = "it's me"
str6 = 'it\'s me'
print(str6)  # it's me
str7 = '\tabc\n123'
print(str7)
str8 = ''           # 空串

3.字符编码

1.编码

计算机只能储存数字,而且是保存数字的二进制的补码,文字符号是无法直接储存到计算机的。为了能够让计算机具备储存文字符号的能力,我们给所有的文字符号对应一个固定的数字,每次储存文字符号的时候就吧符号对应的数字储存起来,符号对应的数字就是符号的编码值。

2.编码表

编码表即保存符号和数字对应关系的表

1)ASCII 码表

a.总共有128个,(美国符号)

b.数字在字母的前面,大写字母(65-90)在小写字母(97-122)前面;大写字母和小写字母之间有其他符号,相差32.

2)Unicode编码表

a.是对ASCII码表的扩展,包含了世界上所有的国家所有的民族所有的语言的符号

b.中文范围:4e00~9fa5

3.编码值的应用

'''
a.chr函数: chr(编码值)	-	获取编码值对应的字符
b.ord函数;ord(字符)		-	获取字符的编码值
c.编码字符:\u4e00		-	 整体是一个字符,(16进制)
注意:python中需要字符的地方必须使用长度为1的字符串
'''
print(chr(97))		# a
print(chr(35), chr(0x23)) #      # #
print(chr(0x4e00), chr(0x9fa5))		# 一 龥
# 获取所有的中文字符:
num = 0
for x in range(0x4e00, 0x9fa5 + 1):
    print(chr(x))
    num += 1
    if num % 30 == 0:
        print()
print()        
# 将大写字母转换成小写字母
c = 'M'
new_c = chr(ord(c) + 32)

2.字符串的相关操作

1.查

字符串获取元素的语法和列表获取元素的语法一模一样。

2.数学运算符

#拼接:用+可以用于字符串拼接
# 练习:提取字符中小写字母
str2 = 'ss试试看78,mvn0-k=上课23'
new_str2 = ''
for x in str2:
    if 'a' <= x <= 'z':
        new_str2 += x
print(new_str2)
new_str3 = [x for x in str2 if 'a' <= x <= 'z']
print(new_str3)      

3.比较运算符

# 两个字符串比较大小,比较的是第一队不相等的字符的编码值的大小
'''
char = ?
判断是否是数字字符:'0' <= char <= '9'
判断是否是小写字母:'a' <= char <= 'z'
判断是否是大写字母:'A' <= char <= 'Z'
判断是否是字母:	'a' <= char <= 'z' or 'A' <= char <= 'Z'
判断是否汉字		'\u0x4e00' <= char <= '\u0x9fa5'	
'''
# 1)比较是否相等 == !=
print('abc' == 'acb')  # False
# 2) 比较大小:>、<、>=、<=
print('Mndf' > 'asd')  # False
print('你好' > 'as')    # True
# 练习2:
# 1)统计中文字符的个数
# 2)打印字符串中所有的数字字符
# 3)提取字符串中所有的字母
str3 = '你好loe--23=sks;M9JHkyu是-12山卡拉'
count = 0
char = ''
for x in str3:
    if '\u4e00' <= x <= '\u9fa5':
        count += 1
    if '0' <= x <= '9':
        print(x, end='')
    if 'a' <= x <= 'z' or 'A' <= x <= 'Z':
        char +=x
print()
print(count)
print(char)

4.in 和 not in

# 字符串1 in 字符串2 	- 判断字符串2中是否包含字符串1
print('abc' in 'abc123')   # True
print('1' in 'abc123')    # True
print('ac' in 'abc123')  # False

5.r语法

  • 如果在字符串前面加r,那么字符串中所有的转义字符的功能都会消失。(阻止转义)
  • 处理windows的路径,先在前面先加个r
  • 正则表达式

6.相关函数

'''
len()	-		获取字符串长度
str(数据)		-	将数据转换成字符串,任何数据都可以转换成字符串;转换的时候是在数据打印值的外边					 加引号
eval(字符串)  -  可以去掉字符串的引号,获取数据,如果去掉引号后是表达式,就会计算表达式的结果。
				字符串中的字母应是定义过的。
'''

3.字符串相关方法

1.join

# 字符串.join(序列)	- 将序列中的元素用指定的字符串拼接成一个字符串(序列中的元素必须是字符串)
list1 = ['abc', '345', 'name']
result = ''.join(list1)				# abc345name
result1 = '+'.join(list1)			# abc+345+name
# 将list2中所有元素拼接成一个字符串(推导式的应用)
list2 = ['abc', 100, True, 'hello']
new_list2 = ''.join([str(x) for x in list2])
# 将list2中所有的字符串拼接成一个字符串(推导式的应用)
result2 = ''.join([x for x in list2 if type(list2) == str])

2.count

# 字符串1.count(字符串2)	-	统计字符串1中字符串2出现的次数
message = 'how are you? i am fine! thank you! and you?'
result3 = message.count('you')
print(result3)

3.index\find

# 字符串1.index(字符串2)	-	获取字符串2第一次出现在字符中的位置(位置是从0开始的下标)
# 字符串1.find(字符串2) 	-	获取字符串2第一次出现在字符中的位置(位置是从0开始的下标)
# 在字符串2不存在的时候index会报错,find会不报错并且返回-1
result4 = message.index('you')
result5 = message.find('you')
result6 = message.rfind('you')  # rfind是指从右侧第一次出现的位置

4.split

# 字符串1.split(字符串2)  -	将字符串1中所有的字符串2作为切割点对字符串进行切割
# 字符串1.split(字符串2,n)	-	最多切n次
注意:无论切割点怎么分布,切完后小字符的个数都是切割点的数量加1
message = 'abcmnabc123abcxyzabcoopabc'
result10 = message.split('abc')  # ['', 'mn', '123', 'xyz', 'oop', '']
print(result10)

5.replace

# 字符串1.replace(字符串2,字符串3)	-	将字符串1中所有的字符串2都替换成字符串3
#字符串1.replace(字符串2,字符串3,N) - 	只能替换前N个
message = 'how are you? i am fine! thank you! and you?'
result11 = message.replace('you', 'me')
result12 = message.replace('you', 'me', 2)

6.center\ljust\rjust\zfill

# 字符串1.center(长度, 填充字符)
# 字符串1.ljust(长度,填充字符)
# 字符串1.rjust(长度,填充字符)
# 字符串1.zfill(长度)			==	字符串1.rjust(长度,0)
str1 = 'abc'
print(str1.center(9, 'x'))
print(str1.rjust(9, 'x'))
print(str1.ljust(9, 'x'))
print(str1.zfill(9))

7.strip\rstrip\lstrip

# strip  -	去掉两边的空格
# rstrip 	-	去掉左边的空格
# lstrip 	-	去掉右边的空格
str2 = '\t   abc 123   \n'
print(str2.strip())   # 去掉两边的空格
print(str2.lstrip())  # 去掉左边的空格’
print(str2.rstrip())  # 去掉右边的空格’

作业

  1. 输入一个字符串,打印所有奇数位上的字符(下标是1,3,5,7…位上的字符)

    例如: 输入**'abcd1234 ’ ** 输出**‘bd24’**

    str1 = 'asdfghjkl123'
    str2 = ''
    for x in str1[1::2]:
        str2 += x
    print(str2)
    
  2. 输入用户名,判断用户名是否合法(用户名长度6~10位)

    name = input('输入用户名:')
    if 6 <= len(name) <= 10:
        print('合法')
    else:
        print('不合法')
    
  3. 输入用户名,判断用户名是否合法(用户名中只能由数字和字母组成)

    例如: ‘abc’ — 合法 ‘123’ — 合法 ‘abc123a’ — 合法

    name = input('输入用户名:')
    count = 0
    for x in name:
        if '0' <= x <= '9' or 'a' <= x <= 'z' or 'A' <= x <= 'Z':
            count += 1
        else:
            print('不合法')
    if count == len(name):
        print('合法')
    
  4. 输入用户名,判断用户名是否合法(用户名必须包含且只能包含数字和字母,并且第一个字符必须是大写字母)

    例如: ‘abc’ — 不合法 ‘123’ — 不合法 ‘abc123’ — 不合法 ‘Abc123ahs’ — 合法

    name = input('输入用户名:')
    count = 0
    if not ('A' <= name[0] <= 'Z'):
        print('不合法')
    else:
        for x in name:
            if '0' <= x <= '9' or 'a' <= x <= 'z' or 'A' <= x <= 'Z':
                count += 1
            else:
                print('不合法')
        if count == len(name):
            print('合法')
    
  5. 输入一个字符串,将字符串中所有的数字字符取出来产生一个新的字符串

    例如:输入**‘abc1shj23kls99+2kkk’** 输出:'123992’

    str1 = 'abc1shj23kls99+2kkk'
    num = ''
    for x in str1:
        if '0' <= x <= '9':
            num += x
    print(num)
    
  6. 输入一个字符串,将字符串中所有的小写字母变成对应的大写字母输出 (用upper方法和自己写算法两种方式实现)

    str3 = 'abc123'
    new_str3 = ''
    for x in str3:
        if 'a' <= x <= 'z':
            new_str3 += chr(ord(x) - 32)
        else:
            new_str3 += x
    print(new_str3)
    # ======================================================
    str3 = 'abc123'
    new_str3 = str3.upper()
    print(new_str3)
    

    例如: 输入**‘a2h2klm12+’ ** 输出 'A2H2KLM12+'

  7. 输入一个小于1000的数字,产生对应的学号

    例如: 输入**‘23’,输出’py1901023’** 输入**‘9’, 输出’py1901009’** 输入**‘123’,输出’py1901123’**

    num = input('输入一个小于1000的数字:')
    num1 = num.zfill(3)
    num2 = 'py1901'
    stu_num = num2 + num1
    print(num1)
    print(stu_num)
    
  8. 输入一个字符串,统计字符串中非数字字母的字符的个数

    例如: 输入**‘anc2+93-sj胡说’** 输出:4 输入**’===’** 输出:3

    str1 = 'anc2+93-sj胡说'
    count = 0
    for x in str1:
        if not ('0' <= x <= '9' or 'a' <= x <= 'z' or 'A' <= x <= 'Z'):
            count += 1
    print(count)
    
  9. 输入字符串,将字符串的开头和结尾变成’+’,产生一个新的字符串

    例如: 输入字符串**‘abc123’, 输出’+bc12+’**

    str1 = 'abc123'
    str2 = str1.replace(str1[0], '+')
    str3 = str2.replace(str2[-1], '+')
    print(str3)
    
  10. 输入字符串,获取字符串的中间字符

例如: 输入**‘abc1234’** 输出:‘1’ 输入**‘abc123’** 输出**‘c1’**

str1 = input('请输入:')
num = len(str1)
if num % 2:
    print(str1[num // 2])
else:
    print(str1[num // 2 - 1], str1[num // 2])
  1. 写程序实现字符串函数find/index的功能(获取字符串1中字符串2第一次出现的位置)

例如: 字符串1为:how are you? Im fine, Thank you! , 字符串2为:you, 打印8

str1 = 'how are you? Im fine, Thank you!'
str2 = 'you'
char = str2[0]
count = 0
for x in str1:
    if char != x:
        count += 1
    else:
        break
print(count)
  1. 获取两个字符串中公共的字符

例如: 字符串1为:abc123, 字符串2为: huak3 , 打印:公共字符有:a3

str1 = 'abc123'
str2 = 'huak3'
str3 = ''
for x in str1:
    for y in str2:
        if x == y:
            str3 += x
            break
print(str3)

上一篇:JZ44 翻转单词序列


下一篇:字符串暴力匹配算法详解