字符串、字符编码、字符串相关操作及相关方法

字符串、字符编码、字符串相关操作及相关方法

什么是字符串

容器型数据类型:
将 ‘’、""、’’’ ‘’'作为容器标志

​ 字符串不可变(不支持增删改),字符串有序(支持下标操作)

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

​ 字符分为两类:普通字符 转义字符(具有特殊意义的字符)

字符串有序(支持下标操作);不可变

1、下标操作 — 单个获取、切片、遍历

  • 单个获取
string = 'Python-2104'
# 字符串[下标]
print(string[0])  #P
print(string[6])  #-
  • 切片
# 字符串[开始下标:结束下标:步长] (省略下标及步长参照列表)
print(string[0:5])  #Python
print(string[:-5:-1])  #4012
print(string[:])  #Python-2104
  • 遍历
  1. 通过元素遍历

for item in 字符串:

循环体

for item in string:
    print(item,end=' ')  #P y t h o n - 2 1 0 4
print()
  1. 通过下标遍历

for index in range(len(字符串)):

循环体

for index in range(len(string)):
    print(string[index],end=' ')   #P y t h o n - 2 1 0 4
print()
  1. 枚举

for index,item in enumerate(字符串):

循环体

for index,item in enumerate(string):
    print(index,item,sep='  ')

字符编码

字符编码:
1、编码
计算机只能直接存储数字(而且保存是数字的二进制补码),文字符号无法直接保存至计算机中

​ 为了能够让计算机具备存储文字符号的功能,我们给所有文字符号对应了一个固定的数字,

​ 每次要存储符号的时候就把符号对应的数字存起来

​ 符号对应的数字就是符号的编码值

​ 2、编码表 — 保存符号和数字对应关系的表

​ 1、ASCII码表

​ a)、总共有128个字符(美国符号:英文输入法)

​ b)、数字在字母前面,大写字母在小写字母前面。大写字母与小写字母不连续

​ 2、Unicode编码表(Python)

​ a)、Unicode编码表是对ASCII表的扩展,包含了世界上所有国家所有民族的所有语言的符号(又称万国码,共

​ 65536个)

​ b)、中文范围:4e00 - 9fa5

​ 3、编码值在Python中的使用

​ a)、chr函数:chr(编码值) — 获取编码值对应的字符

​ b)、ord函数:ord(字符) — 获取字符编码值

​ c)、\ u4e00(4e00就是一个16进制的编码值)

注意:python中需要字符的地方都必须使用长度为1的字符串赋值

# chr()
print(chr(97))  # a
print('第一个中文字符:', chr(0x4e00))
print('最后一个中文字符:', chr(0x9fa5))
number = 0
for item in range(0x4e00, 0x9fa5 + 1):  # 打印Unicode中所有的中文  0x0700,0x074F + 1(叙利亚文)
    print(chr(item), end=' ')
    number += 1
    if (number == 30):
        print()
        number = 0
#ord()
print(ord('蜘'), ord('蛛'), ord('侠'))  # 34584 34523 20384

# 将大写字母转换为对应的小写字母
chart = input('请输入要转换的字母:')
while (1):
    if (ord('z') >= ord(chart) >= ord('a')):
        print(chr(ord(chart) - 32))
        break
    if (ord('Z') >= ord(chart) >= ord('A')):
        print(chr(ord(chart) + 32))
        break
#为了体现这两个函数才这么写的
转义字符

转义字符 — 在特定符号前加 \ 让符号具备特殊功能 常用转义字符:
\ n — 换行

​ \ t — 水平制表符(跳格)

​ \ ’ — 表示一个普通的单引号

​ \ " — 表示一个普通的双引号

​ \ \ — 表示一个普通的反斜杠

​ \ u — 4位的十六进制数 — 编码字符

str3 = '\u4eff'
print(str3)

字符串相关操作

+、*、比较运算、in、not in

  • ‘+’ — 合并字符串

    字符串1 + 字符串2 = 字符串3(字符串1字符串2)

string1 = 'Python'
string2 = '-'
string3 = '2104'

string4 = string1 + string2 + string3
print(string4)  #Python-2104

# 练习:提取字符中小写字母
# 'ss试试看78,mvn0-k=上课23'  -> 'ssmvnk'
str2 = 'ss试试看78,mvn0-k=上课23'
new_str2 = ''
for char in str2:
    if(97 <= ord(char) <= 122):
        new_str2 += char
print(new_str2)    #ssmvnk
  • ‘*’ — 将字符串重复N遍
    字符串1 * N
string6 = string1 * 5
print(string6)  #PythonPythonPythonPythonPython
  • 比较运算 — 比较字符串1与字符串2的第一对不相等字符编码值的大小

    字符串1 (< / > / <= / >= / == / !=) 字符串2

    ​ 判断是否是数字字符:‘0’ <= char <= ‘9’

    ​ 判断是否是小写字母:‘a’ <= char <= ‘z’

    ​ 判断是否是大写字母:‘A’ <= char <= ‘Z’

    ​ 判断是否是字母: ‘a’ <= char <= ‘z’ or ‘A’ <= char <= ‘Z’

    ​ 判断是否是中文: ‘\ u4e00’ <= char <= ‘\ u9fa5’

    string7 = 'python '
    string8 = 'Python'
    print(string7 > string8)  #True
    print(string7 < string8)  #False
    
    print(string7 == string8)  #False
    print(string7 != string8)  #True
    print('Zasddf' > 'zasddf') #False
    
# 练习:
str3 = '你好loe--23=sks;M9JHkyu是-12山卡拉'
# 1)统计中文字符的个数
count = 0
# 通过编码值比较获取
# for char in str3:
#     if(0x4e00 <= ord(char) <= 0x9fa5):
#         count += 1
# 通过字符比较获取
for char in str3:
    if('\u4e00' <= char <= '\u9fa5'):
        count += 1
print('中文字符的个数为:',count)

# 2)打印字符串中所有的数字字符
print('字符串中所有的数字字符:',end=' ')
for char in str3:
    if('0' < char < '9'):
        print(char,end=' ')
print()

# 3)提取字符串中所有的字母
str4 = ''
for char in str3:
    if('a' <= char <= 'z' or 'A' <= char <= 'Z'):
        str4 += char
print('字符串中所有的字母为:',str4)
  • in 和 not in — 判断字符串2中是否包含字符串1(字符串1是否是字符串2子串)

    注意:这里区分大小写(编码值的不同)!

print('9' in '999zzx')  #True
print('zzx' in '999zzx')  #True
print('zzx' in 'zz99x9')  #False
  • len(字符串) — 获取字符串长度(只要是引号里的都算)
print(len(string7))  #7
print(len(string8))  #6
print(len('1,2,3'))  #5
  • str() — 将数据(任何类型的数据)转换为字符串

    ​ 转换的时候是在数据打印值外加括号

number = 123
print(type(number))
number1 = str(number)  #<class 'int'>
print(type(number1))   #<class 'str'>   '123'
print(type(number))    #<class 'int'>  原来的number类型不变

numbers = [1,2,3,4]
numbers1 = str(numbers)
print(type(numbers),numbers)   #<class 'int'> [1, 2, 3, 4]
print(type(numbers1),numbers1)  #<class 'str'> '[1, 2, 3, 4]'

numbers2 = {'a':1,'b':2}
numbers3 = str(numbers2)
print(type(numbers3),numbers3)  #<class 'str'> "{'a': 1, 'b': 2}"

numbers4 = (1,2,(3,4))
numbers5 = str(numbers4)
print(type(numbers5),numbers5)  #<class 'str'> '(1, 2, (3, 4))'

print(str(lambda x: x * 2))   #'<function <lambda> at 0x000001DA2BEA5040>'
  • r语法(r-string) — 在字符串前面加r(阻止转移)

    若在字符串前面添加r®,那么字符串中所有转义字符的功能都将消失不在具有特殊功能

str5 = '999\nzzx'
new_str5 = R'999\nzzx'

# 应用:表示路径
# path = 'E:\Python\name\code\a.txt'
# 其他语言:在所有'\'后加一个'\'  ---  path = 'E:\\Python\\name\\code\\a.txt'
# python:
path = r'E:\Python\name\code\a.txt'
print(path)   #E:\Python\name\code\a.txt
  • eval(字符串) — 去掉字符串最外层引号,获取数据。若去掉引号后是一个表达式。则将计算其结果
result1 = eval('100')
print(result1)   #100

result2 = eval('[999, 999]')
print(result2)  #[999, 999]

result3 = eval('999 + 1')
print(result3)  #1000

只列举了一些常用函数字符串所有相关函数如下(截图自菜鸟教程):
字符串内置函数

字符串相关方法

join()

字符串(拼接符).join(序列) — 将序列中的元素用指定的字符串拼接成一个字符串(序列中的元素必须是字符串

list1 = ['zzx','999','hhh']
str1 = ''.join(list1)
print(str1)  #zzx999hhh

str2 = '+'.join(list1)
print(str2)  #zzx+999+hhh

str3 = 'king'.join(list1)
print(str3)  #zzxking999kinghhh

list2 = ['zzx', 999, 111]
str4 = ''.join([str(item) for item in list2])
print(str4)  #zzx999111

练习:将list2中所有的字符串拼接成一个字符串

list3 = ['abc', 100, True, 'hello']     # abchello
str5 = ''.join([i for i in list3 if type(i) == str])
print(str5)  #abchello
count()

字符串1.count(字符串2) — 统计字符串1中字符串2出现的次数

message = 'how are you? i am fine! thank you! and you?'
times = message.count('you')
print(times)  #3
index / find

字符串1.index(字符串2) — 获取字符串2第一次出现在字符串1中的位置(位置是从0开始的下标值)

字符串1.find(字符串2) — 获取字符串2第一次出现在字符串1中的位置(位置是从0开始的下标值)

在字符串2不存在的时候index会报错,find不会报错而返回-1

rfind / rindex — 从右往左数(最后一个)

result1 = message.index('you')
print(result1)  #8

result2 = message.find('you')
print(result2)  #8

# result3 = message.index('zzx')
# print(result3)   #ValueError: substring not found 报错

result4 = message.find('zzx')
print(result4)   # -1
split()

字符串1.split(字符串2) — 将字符串1中所有的字符串2作为切割点对字符串1进行切割(结果用列表返回)

字符串1.split(字符串2,N) — 最多切N次

message = 'mnabc123abcxyzabcoop'
result5 = message.split('abc')
print(result5)  #['mn', '123', 'xyz', 'oop']

注意:如果切割点怎么分布,切完后小字符串的个数都是切割点的数量加1

message = 'abcmnabc123abcabcxyzabcoopabc'
result6 = message.split('abc')
print(result6)  #['', 'mn', '123', '', 'xyz', 'oop', '']

message = 'mnabc123abcxyzabcoop'
result7 = message.split('abc',1)
print(result7)  #['mn', '123abcxyzabcoop']
replace()

字符串1.replace(字符串2,字符串3) — 将字符串1中所有的字符串2替换成字符串3

字符串1.replace(字符串2,字符串3,N) — 将字符串1中所有的字符串2替换成字符串3,只替换前N个

message = 'how are you? i am fine! thank you! and you?'
result8 = message.replace('you','me')
print(result8)  #how are me? i am fine! thank me! and me?

message = 'how are you? i am fine! thank you! and you?'
result9 = message.replace('you','me',2)
print(result9) #how are me? i am fine! thank me! and you?
center() / rjust() / ljust() / zfill()

字符串.center(长度,填充字符) — 将字符串转换成指定长度的字符串,长度不够用填充字符补充,原字符串居中显

字符串.rjust(长度,填充字符) — 将字符串转换成指定长度的字符串,长度不够用填充字符补充,原字符串靠右显示

字符串.ljust(长度,填充字符) — 将字符串转换成指定长度的字符串,长度不够用填充字符补充,原字符串靠左显示

字符串.zfill(长度) == 字符串.rjust(长度,‘0’)

str6 = 'zzx'
print(str6.center(9,'9'))   #999zzx999
print(str6.center(8,'9'))   #99zzx999  不等时后面填充长度大于前面

其余用法同center()

strip / rstrip / lstrip

strip — 同时去掉字符串两边所有的空白

rstrip — 去掉字符串右边所有的空白

lstrip — 去掉字符串左边所有的空白

str7 = '\t          zzx 999 hello     '
print(str7.strip())  #zzx 999 hello

其余用法同strip()

练习

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

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

    string = 'zhzexl9l9o9w*o*r*d'
    print(string,'所有奇数位上的字符为:')
    for index in range(1,len(string),2):
        print(string[index],end=' ')
    print()
    
  2. 输入用户名,判断用户名是否合法(用户名长度6~10位)

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

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

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

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

    user_name2 = input('请输入用户名:')
    numbers_count = letter_count = 0
    if('Z' < user_name2[0] or user_name2[0] < 'A'):
        print('用户名不合法!')
    else:
        for char in user_name2:
            if ('a' <= char <= 'z' or 'A' <= char <= 'Z'):
                letter_count += 1
                continue
            elif('0' <= char <='9'):
                numbers_count += 1
                continue
            else:
                print('用户名不合法!')
                break
    if(numbers_count >= 1 and letter_count >= 1):
        print('用户名合法!')
    
  5. 输入一个字符串,将字符串中所有的数字字符取出来产生一个新的字符串

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

string1 = input('请输入一个字符串:')
new_string1 = ''
for char in string1:
    if('9' >= char >= '0'):
        new_string1 += char
if(not new_string1):
    print('字符串中没有数字字符!')
else:
    print('字符串中所有的数字字符:',new_string1)
  1. 输入一个字符串,将字符串中所有的小写字母变成对应的大写字母输出 (用upper方法和自己写算法两种方式实现)

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

   string2 = input('请输入一个字符串:')
   # 方法一:upper()函数
   # string3 = string2.upper()
   # print(string3)
   
   # 方法二:
   for char in string2:
       if('z' >= char >= 'a'):
           print(chr(ord(char) - 32),end='')
       else:
           print(char,end='')
   print()
 #方法三:
new_string2 = ''.join([chr(ord(char) - 32) if 'z' >= char >= 'a' else char for char in string2])
print('字符串中所有的小写字母变成对应的大写字母为:',new_string2)  
  1. 输入一个小于1000的数字,产生对应的学号

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

school_number =  input('请输入一个小于1000的数:')
string4 = 'py1901'
print('您的学号是:',string4 + school_number.zfill(3))
  1. 输入一个字符串,统计字符串中非数字字母的字符的个数

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

     
 string5 = input('请输入一个字符串:')
   count = 0
   for char in string5:
       if('a' <= char <= 'z' or 'A' <= char <= 'Z' or '0' <= char <= '9'):
           continue
       else:
           count += 1
   print('字符串中非数字字母的字符的个数为:',count)
   # 方法二:
   string6 = input('请输入一个字符串:')
new_string6 = '+' + string6[1:-1] + '+'
  1. 输入字符串,将字符串的开头和结尾变成’+’,产生一个新的字符串

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

    string6 = input('请输入一个字符串:')
    string7 = '+'
    for index in range(1,len(string6) - 1):
        string7 += string6[index]
    else:
        string7 += '+'
    print('将字符串的开头和结尾变成+为:',string7)
    
  2. 输入字符串,获取字符串的中间字符

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

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

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

string9 = 'how are you ? Im fine , Thank you !'
string10 = 'you'
for index in range(len(string9)):
    if(string10[0] == string9[index] and string10[1] == string9[index + 1]and string10[2] == string9[index + 2]):
        print(string9,'中',string10,'第一次出现的位置是:',index)
        break
else:
    print(string9,'中没有',string10)
    #方法二
string9_length = len(string9)
string10_length = len(string10)

for index in range(string9_length - 2):
    if(string9[index : index + string10_length] == string10):
        print(string9,'中',string10,'第一次出现的位置是:',index)
        break
else:
    print(string9,'中没有',string10)
  1. 获取两个字符串中公共的字符

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

string11 = input('请输入一个字符串:')
string12 = input('请输入一个字符串:')

same_string = ''
for char1 in string11:
    for char2 in string12:
        if(char1 == char2 and char1 not in same_string):
            same_string += char1
print('两个字符串中公共的字符:',same_string)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值