跳至主要內容

03-字符串

黑静美...大约 11 分钟编程python

1.字符串的定义

字符串是由字母、数字和特殊字符组成的序列。

2. 创建字符串

——使用单引号、双引号、或者三个单(双)引号(段落)

name = "好"
number = "18"
paragraph = '''Hello!
Hallo!'''
paragraph_two = """Hello!
Hallo!"""
print(name + number)

为什么Python同时支持三种创建字符串的方法?

  1. 单引号,双引号
#string = 'I'm Lilei.' 报错
string = "I'm Lilei." #支持单引号
string = "I'm Lilei."
string2 ='"不好"' #支持双引号
print(string1)
print(string2)

避免单双引号混用

  1. 三个引号
string3 = '111\
\
222\
\
333\
'
print(string3) #结果不能分段

string3 = '''111
222
333
'''
print(string3)

相关信息

  1. 可以原样输出(保留段落格式)
  2. 实现多行注释

使用len()获取字符串长度

string = "0123456789"
print(len(string))
10

Process finished with exit code 0

3. 获取字符

1. 通过索引获取

1. 提取单个字符

string = "123456789"
# 1
select = string[0]
print(select)
# 9
select = string[8]
print(select)
select = string[-1]
print(select)
select = string[len(string)-1]
print(select)

2. 提取多个字符

select = string[0:3] #取到前面一位
print(select)
123

不连续字符串

string = "0123456789"
#13579
select = string[1:10:2]
#              [start:end:sep] sep默认为1 start默认为最开始一位(正序为0) end默认为遍历(正序为最后一位+1,倒叙-1)
#02468
select = string[0:9:2]
print(select)
#02468
select = string[::2] # start默认为最开始一位 end遍历可省略
print(select)

注意

sep正负控制方向,大小控制步长

#9876543210
select = string[-1::-1]
print(select)
select = string[::-1] #相同
print(select)
select = string[-1:-11:-1] #倒叙从-1开始
print(select)
# select = string[-1:-11] 后者比前者小,不加-1默认无法显示
string = "I'm Lilei."
select = string[-2:-11:-1]

3.

1. .upper()

将字符串全部大写

2. .lower()

将字符串全部转换为小写

3. .captalize()

将字符串首字母转换为大写,其余转换为小写。(只针对第一个字母)

4. .title()

将字符串中每个单词的首字母转化为大写,其余为小写。

print(select)
up_str = string.upper()
print(string.upper())
print(up_str)
low_up_str = up_str.lower()
print(low_up_str)
cap_str = string.capitalize()
print(cap_str)
title_str = string.title()
print(title_str)
ieliL m'I
I'M LILEI.
I'M LILEI.
i'm lilei.
I'm lilei.
I'M Lilei.

5. .startwith()

检测字符串是不是以特定字符或单词开头,并返回布尔值

string = "I'm Lilei."
start_i_str = string.startswith("i")
print(start_i_str)
start_I_str = string.startswith("I")
print(start_I_str)
start_I_str = string.startswith("I'm")
print(start_I_str)

6. .endwith()

检测字符串是不是以特定字符或单词结尾,并返回布尔值

end_doc_str = string.endswith(".")
print(start_i_str)

7. .count()

计算特定字符串或者单词在目标字符串中存在的次数

count_i_str = string.count("i")
print(count_i_str)
False
True
True
False
2

8. .find()

寻找特定字符或单词在特定 字符串中第一次出现的下标。(后面出现的不再记入)

如果查找的字符不存在,则返回-1

find_i_str = string.find("i")
print(find_i_str)
find_1_str = string.find("1")
print(find_1_str)
5
-1

9. .index()

寻找目标字符或单词在特定字符串中,第一次出现的下标。如果是查找单词,那么 index() 返回目标单词的第一个字符的下标。

如果查找的单词不存在则会报错。

find_i_str = string.index("i")
print(find_i_str)

# 5

# index_1_str = string.index("1")
# print(index_1_str)
    index_1_str = string.index("1")
ValueError: substring not found

10. .isdigit()

判断字符串是不是纯数字字符串,如果存在非数字(比如下方空格)则报错

string = "12345678"            #True
isdigit_ = string.isdigit()
print(isdigit_)

string2 = "123 45678"          #False
isdigit_2 = string2.isdigit()
print(isdigit_2)

11. .isalpha()

判断字符串是不是纯字母字符串,如果存在非字母(比如下方空格)则报错

string = "goodjob"            #True
isalpha_=string.isalpha()
print(isalpha_)

string2 = "good job"          #False
isalpha_2 = string2.isalpha()
print(isalpha_2)

12. .isalpha()

(10)\and\and​(11)

string = "1niceday"            #True
isalnum_=string.isalnum()
print(isalnum_)

string2 = "1nice day"          #False
isalnum_2 = string2.isalnum()
print(isalnum_2)

13. .isupper()

判断是否全部为大写

string = "I'm Lilei."
up_str = string.upper()
print(up_str)
up_result = up_str.isupper()
print(up_result)  # True 空格等其他内容不作判断

string2 = "你好"
print(string2)
up_str2 = string2.upper()
print(up_str2)
up_result = up_str2.isupper()
print(up_result) # False 不存在字母

14..islower()

判断是否全部为小写

string = I'M LILEI.
low_str = string.lower()
print(low_str)
low_result = low_str.islower()
print(low_result)               # True

string2 = "你好"
low_str2 = string2.lower()
print(low_str2)
low_result = low_str2.islower()
print(up_result)                # False
string2 = "你好a"
low_str2 = string2.lower()
print(low_str2)
low_result = low_str2.islower()
print(low_result)               # True 存在字母,且字母都为小写

15. .isspapce()

判断是否全部为空字符(空格),纯空格返回True,否则返回False

string = ""
place_ = string.isspace()
print(place_)                 #False

string = " "
place_ = string.isspace()
print(place_)                 #True

string = "                                                                                                                                      " #文本换行,但是实际没有换行
place_ = string.isspace() 
print(place_)                 #True


16. .strip()

默认去掉字符串前后的空白字符,如果指定参数,则去掉指定字符。

去掉字符的个数不限,但是只能去掉连续的内容

想要去掉所有的内容,可以用[.replace()](#__21. `.replace())实现

string = "  0123456  "
print('string>>>', string, sep="")
strip_ = string.strip()
print('strip>>>', strip_, sep="")

string = " "
strip_ = string.strip()
print(strip_) # 什么都没有了

print("注意上方还有一个知识点")
string = "11101234561111"
print('string>>>', string, sep="")  # 所有"1"都去掉,个数不限,但是
strip_ = string.strip("1")
print('strip"1”>>>', strip_, sep="")   # 只能去掉连续的内容

string = "111 1234561111"
print('\nstring>>>', string, sep="") 
strip_ = string.strip("1")
print('strip>>>', strip_, sep="")   # 只能去掉连续的内容
string>>>  0123456  
strip>>>0123456

注意上方还有一个知识点
string>>>11101234561111
strip"1”>>>0123456

string>>>111 1234561111
strip>>> 123456
\

⚠️注意

如果想去掉两种及以上内容,写出.strip(“”,“”)是 不对的

strip_ = string.strip("1","2")
TypeError: strip expected at most 1 argument, got 2

直接在strip(“”)写入两种(及以上)内容即可。去掉的内容不计前后顺序

string = "111 1234561111"
strip_ = string.strip("1 ")
print('strip"1 ">>>', strip_, sep="")    # 不计前后顺序
strip_2 = string.strip(" 1")
print('strip" 1">>>', strip_2, sep="")   # 不计前后顺序
strip_2 = string.strip("11")
print('strip"11">>>', strip_2, sep="")   # 不计前后顺序,等价于.strip("1")
strip_2 = string.strip("2 1")
print('strip"2 1">>>', strip_2, sep="")

17. .lstrip()

默认去掉字符串左边(前边)的空白字符

string = "  0123456  "
strip_ = string.lstrip()
print(strip_)

18. .rstrip()

默认去掉字符串右边(后边)的空白字符

string = "  0123456  "
strip_ = string.rstrip()
print(strip_)

19. .split()

split(sep)进行指定分割

string2= string_.split()
print(string2)

string3 = "1-2-3-4-5-6-7-8-9"
split_str3 = string3.split()
print(split_str3)
split_str3= string3.split("-")
print(split_str3)

string4 = "1---2--3-4-5-6-7-8-9"
split_str4 = string4.split("-")
print(split_str4)

split(sep,maxsplit)指定分割次数

20. .rplit()

rplit(sep, maxsplit)从字符串右边进行分割,也可以传入参数sepmaxsplit指定分割次数

split_str4 = string4.split("-",3)
print(split_str4)

split_str4 = string4.rsplit("-",3)
print(split_str4)

不指定maxsplit 二者相同


21. .replace()

.replace(old,new,count)count表示替换多少次,比如其中有4处可替换文本,但是count数目等于3,只替换前3

如果没有数目默认全部替换

string_ = "Ue b e r s e t z u n g"
print(string_)

string = string_.replace(" ","")
print(string)

4. join

以特定字符串进行间隔

"字符内容".join(string)

string = "Übersetzung"
join_str = " ".join(string)
print(join_str)

5. 字符串格式化输出

2. 字符串变量“相加”

可以将字符串变量“相加”,即按先后顺序排列到一起

和数字加法不同,因此数字型和字符型不能相加

---
#Hi,welcome to Xiameng 
#Hi,welcome to Xiameng 
#Hi,welcome to Xiameng 
#Hi, welcome  to  Xiameng  
2. 一并输出数字

如果想一并输出数字,可以使用str将数字(数字型变量)转换为字符串

time = 2024
string = str1 + str2 + str3 + str4 + str(2024)
print(string)
string = str1 + str2 + str3 + str4 + str(time)
print(string)
3. 在文本内部插入其他输入内容

如果想从一段文本中间插入内容,而不是补到末尾,可以使用带“{}”的字符串+.format("")将文本填入“{}”中

template_str = "Hi {}, welcome to Xiameng 2024"
print(template_str)
print(template_str.format("Lilei"))
string1 = str1 +"{}, "+ str2 + str3 + str4 + str(2024)
print(string1.format("Lilei"))

如果有多个“{}”,则用,分割填入的内容,按从左到右的顺序填充

string2 = "Hi {}, welcome to {}"
print(string2.format("W", "厦门"))

#---output---
#Hi W, welcome to 厦门

指定参数

4. 参数顺序指定(改变填充顺序)
string3 = "Hi {1}, welcome to {0}"
print(string3.format( "厦门","W"))

#---output---
#Hi W, welcome to 厦门

5. 参数名称指定(固定模版在先)
string = "Hi {name},welcome to {region}.".format(name="W", region="Germany")
print(string)
template_str = "Hi {name},welcome to {region}"
print(template_str.format(region="Germany", name="W"))  #可以改变顺序
#---output---
#Hi W,welcome to Germany.
#Hi W,welcome to Germany.
5.2.直接读取变量(传入参数在先)
name = "Lilei"
region = "厦门"
string = f"Hi {name}, welcome to {region}"
print(string)
#---output---
#Hi Lilei, welcome to 厦门
6.插入数字型,并保留特定小数位

使用带“{:.type}”的数字型+.format("")将文本填入“{}”中

:.type 可以为下方的

string = "Money is {:.3f}".format(190)  # .3f 浮点数保留三位小数
print(string)

#---output---
#Money is 190.000
6.2.(传入参数在先)
money = 190
string = f"Money is {money:.3f}"
print(string)
#---output---
#Money is 190.000

以上两次第二种方法均用到了f"" (““内为文本内容)的形式

6. %格式化(固定模版在先)

  • %d 整数
  • %s 字符串
  • %f 浮点数

1. 单个位置传入

string = "Money is %d" #i

print(string%13)  #1

new_s = string % 13  #2
print(new_s)

string = "Money is %d" %13 #i1\ i2\ 3 是等价的
print(string)

#---output---#
#Money is 13
#Money is 13
#Money is 13

2. 多个位置传入

string = "Money is %d, %s"

new_s = string %(1300, "超有钱")
print(new_s)

print(string%(1300,'超有钱'))

string = "Money is %d, %s" %(1300,'超有钱')
print(string)

#---output---#
#Money is 1300, 超有钱
#Money is 1300, 超有钱
#Money is 1300, 超有钱

3.保留小数位

string = "Money is %.2f"
new_s = string % 18
print(new_s)

string = "Money is %.2f"
print(string%18)

string = "Money is %.2f" %18
print(string)

#---output---
# Money is 18.00
# Money is 18.00
# Money is 180.00

7. 字符串不可变性

字符串是不可变的,除重新赋值外,不可以改变字符串中的任何元素。

s = "hello"
print(s)
print(s[0])  #output:h

# s[0] = "a"
# Traceback (most recent call last):
#     s[0] = "a"
# TypeError: 'str' object does not support item assignment

如果需要改变字符串中的元素,则需要新建一个字符串。

或者使用replace替代掉之前的一些字符。

此外还可以使用**字符串拼接**

字符串拼接
s = "hello"
news = "a"+s[1:] #s[1:]为第1位到最后
print(news)

#---output---
#aello

8. 字符串转义

转义字符含义举例
\\在字符串中得到\s = "a\\b\\c"
\b退格,删除\b前一位的内容,类似删除键s = "a\\\b\\c"
s = "a\b\\c"
\t在字符串中得到制表符s = "a\tb\\c"
\n换行s = "a\nb\\c"
rR取消转义s = r"a\\\b\\c"
s = r"a\b\c"

output

a\b\c a\c \c a b\c a b\c

a\\\b\c a\b\c

9. 字符串的连接(含字符串“乘法”)

s1 ="Happy"
s2 = "Birthday"
print(s1+s2) #形成了一个新的字符串
print(s1,s2) #两个独立的字符串(且输出默认有空格间隔)

# “乘法”
s1 ="-Happy"
print(s1*10)
print(s1*10,end="-\n")
HappyBirthday
Happy Birthday
-Happy-Happy-Happy-Happy-Happy-Happy-Happy-Happy-Happy-Happy
-Happy-Happy-Happy-Happy-Happy-Happy-Happy-Happy-Happy-Happy-

10.读取用户输入input()

1. 使用input
user_input = input()
print(user_input)

#---terminal---
# 123
# output
# 123
2. 在input里面输入打印提示
user_input = input("Enter your name>>>")
print(user_input)
Enter your name>>>W
W
注:input里面得到的都是字符串
(.venv) ➜  pythonProject ✗ ipython

In [1]: type(input(':>>>'))
:>>>good job
Out[1]: str

In [2]: type(input(':>>>'))
:>>>123
Out[2]: str

In [3]: type(input(':>>>'))
:>>>123.1
Out[3]: str

In [4]: type(input(':>>>'))
:>>>(1,2,3,4)
Out[4]: str

In [5]: type(input(':>>>'))
:>>>[1,2,3,4]
Out[5]: str

In [6]: type(input(':>>>'))
:>>>{1,2,3,4}
Out[6]: str

In [7]: type(input(':>>>'))
:>>>['a':19,'b':19]
Out[7]: str

In [8]: type(input(':>>>'))
:>>>True
Out[8]: str

如果想要输入其他类型,需要进行类型转换

3. 类型转换
方法1: 强制类型转换
In [9]: n = int(input(':>>>'))
:>>>12

In [10]: type(n)
Out[10]: int

In [11]: #list存在一些问题

In [1]: l = list(input(">>>")) 
>>>123

In [2]: l #该输入内容会被强制转换为列表
Out[2]: ['1', '2', '3']

In [3]: type(l)
Out[3]: list

In [4]: list(input(">>>"))
>>>[1,2,3]  
Out[4]: ['\udce3', '[', '1', ',', '2', ',', '3', ']']

#所以按照之前list的格式放入input反而是错误的
  • 适合:确定变量类型中的:数字(整数、浮点数)、字符串、布尔型
  • 不适合:列表、元组、字典、集合;不确定的变量类型
方法2:使用eval()
In [1]: s = eval(input(':>>>'))
:>>>12

In [2]: s, type(s)
Out[2]: (12, int)

In [3]: s = eval(input(':>>>'))
:>>>12.1

In [4]: s, type(s)
Out[4]: (12.1, float)

In [5]: s = eval(input(':>>>'))
:>>>(1,2,3)   

In [6]: s, type(s)
Out[6]: ((1, 2, 3), tuple)

In [7]: s = eval(input(':>>>'))
:>>>[1,2,3]        

In [8]: s, type(s)
Out[8]: ([1, 2, 3], list)

In [9]: s = eval(input(':>>>'))
:>>>{1,2,3} 

In [10]: s, type(s)
Out[10]: ({1, 2, 3}, set)

In [11]: s = eval(input(':>>>'))
:>>>True

In [12]: s, type(s)
Out[12]: (True, bool)

eval()不能识别的内容
  • 空白的内容
 :>>>
 Traceback (most recent call last):
 print(eval(input(':>>>')))
 File "<string>", line 0
    
SyntaxError: unexpected EOF while parsing
  • ❌未加引号的字符串
In [13]: s = eval(input(':>>>'))
:>>>string        
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[13], line 1
----> 1 s = eval(input(':>>>'))

File <string>:1

NameError: name 'string' is not defined

string被识别为了一个变量,由于这个变量没有给出所以报错

print(string)
s = eval(input(':>>>'))
print(s)

# string
# :>>>string
# string
eval()如何实现数据类型转换

字符串是外部存在引号。eval()则是把这样的引号去除。

上文的string 没有这样的引号,如果没有定义,用于给其他变量赋值等也会报错


  • 加入引号
:>>>"string"
string
实现运算两个数字间的运算
print(eval(input(':>>>')))

#------
# :>>>1+1
# 2
In [14]: eval(input(':>>>'))
:>>>1+1
Out[14]: 2

In [15]: eval(input(':>>>'))
:>>>2-3
Out[15]: -1

In [16]: eval(input(':>>>'))
:>>>2/3
Out[16]: 0.6666666666666666

In [17]: eval(input(':>>>'))
:>>>2*3
Out[17]: 6

练习

通过一个input,实现两个数字的运算
add = input('two numbers separated by" ">>>').split(" ")
print(eval(add[0]) + eval(add[1]))
print(float(add[0]) + float(add[1]))

sub = eval(input('two numbers separated by" ">>>').replace(" ","+"))
print(sub)
上次编辑于:
贡献者: Heijingmei
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3