字符串是计算机编程中表示文本数据的一种数据类型。它是由字符组成的序列,可以包含字母、数字、标点符号和其他特殊字符。
1. 字符串的转义符
转义有两层含义:
将一些普通符号赋予特殊功能,比如
\n
,\t
等将一些特殊符号变为普通符号,比如
\"
,\\
等
以下是一些常见的转义字符及其含义:
\n
:换行符,表示在字符串中创建一个新行。\t
:制表符,表示在字符串中插入一个水平制表符(Tab)。\b
:退格字符,b代表backspace,可以把一个退格符看成一个backspace键。\"
:双引号,用于在字符串中包含双引号字符。\'
:单引号,用于在字符串中包含单引号字符。\\
:反斜杠,用于在字符串中包含反斜杠字符本身。
s1 = 'D:\Program Files\nancy\table\back\Python 3.8\python.exe'
print(s1)
s2 = 'D:\Program Files\\nancy\\table\\back\Python 3.8\python.exe'
print(s2)
# r代表的是raw-string
s3 = r'D:\Program Files\nancy\table\back\Python 3.8\python.exe'
print(s3)
# 这种只能转义,raw-string是无效的
s4 = "i'm \"yuan!\""
s5 = 'i\'m "yuan!"'
print(s4)
print(s5)
这里有个问题要了解下,
\n
实际是是Python语言层面处理的,Python中的转义字符效果在不同系统上是一致的
2. 格式化输出(重点)
格式化输出是一种将变量值和其他文本组合成特定格式的字符串的技术。它允许我们以可读性更好的方式将数据插入到字符串中,并指定其显示的样式和布局。
在Python中,有多种方法可以进行格式化输出,其中最常用的方式是使用字符串的 f-strings(格式化字符串字面值)。
%占位符
name = "Yuan"
age = 19
message = "My name is %s, and I am %s years old." % (name, age)
print(message)
在这个示例中,我们使用 %s
占位符将变量 name
的值插入到字符串 "Hello, %s!"
中,然后通过 %
运算符进行格式化。在执行格式化时,%
运算符的左侧是字符串模板,右侧是要按顺序插入的值。
这种就是C语言的那种,它还可以使用%d、%f来分别代表整数和浮点数,python3.6后更多的是使用f-string,所以这里只是简单介绍下。但要注意的是,如果使用的是%s,即使用的填充变量是其他类型解释器会自动将其转成str,但是如果你用了%d,而提供的是字符串的数字,是会报错的!
f-string格式
格式化字符串字面值(Formatted String Literal,或称为 f-string)来进行格式化输出。适用于 Python 3.6 及以上版本
name = "yuan"
age = 18
height = 185.123456
# . 的左边是宽度,右边是保留的小数位
s = f"姓名:{name: ^15},年龄:{age},身高:{height:^15.5}cm"
print(s)
name = "alex123456"
age = 18
height = 185
print(s)
# 输出结果
姓名: yuan ,年龄:18,身高: 185.12 cm
姓名: yuan ,年龄:18,身高: 185.12 cm
宽度与精度
格式描述符形式为:width[.precision]
。
width
正整数,设置字符串的宽度。precision
非负整数,可选项,设置字符串的精度,即显示字符串前多少个字符。(注意:针对数字字符串不是小数位,是有效数字)
填充与对齐
格式描述符形式为:[pad]alignWidth[.precision]
。
pad
填充字符,可选,默认空格。align
对齐方式,可选<
(左对齐),>
(右对齐),^
(居中对齐)。
虽然 %s
是一种用于字符串格式化的方式,但自从 Python 3.6 版本起,推荐使用格式化字符串字面值(f-string)或 .format()
方法来进行字符串格式化,因为它们提供了更简洁和直观的语法。
补充两个重要的知识点:
这个默认对齐方式是字符串靠左,数字靠右
另外{}中是表达式,而不仅仅是变量,这意味着可以这样:
{typeof(1 + 1)}
总结(重点):
3. 字符串序列操作
索引和切片
在编程中,索引(Index)和切片(Slice)是用于访问和操作序列(如字符串、列表、元组等)中元素的常用操作。
字符串属于序列类型,所谓序列,指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们。
索引用于通过指定位置来访问序列中的单个元素。在大多数编程语言中,索引通常从0开始,表示序列中的第一个元素,然后依次递增。而负索引从 -1 开始,表示序列中的最后一个元素。使用方括号
[]
来访问特定索引位置的元素。切片用于从序列中获取一定范围的子序列。它通过指定起始索引和结束索引来选择需要的子序列。切片操作使用方括号
[]
,并在方括号内使用start:stop:step
的形式。注意,start
的元素可以获取到,stop
的元素获取不到,最后一个元素是[stop-1]
对应的元素。
s = "hello yuan"
# (1) 索引:获取某个字符
print(s[0]) # "h"
print(s[-1]) # "n"
# (2) 切片:获取某段子字符串
print(s[2:5]) # 输出"llo"
print(s[:5]) # 输出"hello"
print(s[6:-1]) # 输出"yua"
print(s[6:]) # 输出"yuan"
print(s[:]) # 输出"hello yuan"
print(s[-1:-3:-1]) # 输出"na"
print(s[::-1]) # 输出"nauy olleh"
补充:
1、步长是正的,就是从左到右,步长是负的就是从右到左
2、[::-1] 反转字符串要记住,后面可能要用
3、如果超出了索引,或者方向截取不对,python中不会报错,切片不了就返回空。
其它操作
# 不支持修改,添加元素
# 这是因为字符串在Python中被视为不可更改的序列。一旦创建了一个字符串,就无法直接修改其字符。
# s[0] = "a"
# s[10] = "!"
# 支持的操作
# (1) 获取长度,即元素个数(只要是容器都有len,不一定是序列,如字典与集合)
print(len(s)) # 10
# (2) +、*拼接
s1 = "hello"
s2 = "yuan"
print(s1 + " " + s2)
print("*" * 100)
# 字符串累加
s = ""
s += s1
s += s2
# (3) in判断
print("yuan" in s) # True
4. 字符串内置方法
首先心里要非常清楚的是,字符串是不可变的,所以所有的操作都是返回新的字符串,而不是在原来的字符串上修改!
# (1) 字符串转大写:upper(),字符串转小写:lower()
s = "YuanHao"
print(s.upper()) # YUANHAO
print(s.lower()) # yuanhao
# (2) 判断是否以xxx开头
name = "张三"
# 判断是不是姓张
print(name.startswith("张"))
# (3) 判断是否以xxx结尾
url = "/xxx/yyy/zzz/a.png"
print(url.endswith("png"))
# (4) find和index都是查找某子字符串的索引,find找不到返回-1,index找不到报错
print(name.find("三"))
print(name.index("三"))
# (5) 去除两端空格或换行符\n
name = input("请输入姓名:")
print(name, len(name))
name = name.strip()
print(name, len(name))
test = "**hexon****"
print(test.strip("*")) # 也可以带参数,另外还有lstrip和rstrip
# (6) 判断某字符串是否全是数字(小数点不行,只是判断整数)
print("123".isdigit())
# (7) split()和join()
cities = "天津 北京 上海 哈尔滨"
cities_list = cities.split(" ")
print("cities_list", cities_list)
print(len(cities_list))
ret = ",".join(cities_list) # 这里要注意,这些方法都是字符串的,所以是分隔符调用join方法,这个与数组的不一样
print(ret) # "天津,北京,上海,哈尔滨
info = "yuan 19 180"
info_list = info.split(" ")
print(info_list[0])
print(info_list[1])
print(info_list[2])
# (8) replace(): 子字符串替换
sentence = "PHP is the best language.PHP...PHP...PHP..."
new_sentence = sentence.replace("PHP", "Python")
print(new_sentence)
comments = "这个产品真棒!我非常喜欢。服务很差,不推荐购买。这个餐厅的食物质量太差了,味道不好。我对这次旅行的体验非常满意。这个电影真糟糕,剧情一团糟。这个景点真糟糕,再也不来了!"
comments = comments.replace("差", "***").replace("不推荐", "***").replace("糟糕", "***")
print(comments)
# (9) count:计算字符串中某个子字符串出现的次数
print(sentence.count("PHP"))
5. 今日作业
【复习】1、字符串索引切片练习
s= "hello world"
# 操作1:通过正反索引切片world
print(s[6:])
print(s[-5:]) # 易错!!!
# 操作2: 获取world的翻转,即"dlrow"
print(s[6:][::-1])
print(s[-1: -6: -1])
2、有些程序经常需要引导用户输入"Y"或"N",其中"Y"代表肯定,"N"代表否定。无论用户输入大写的"Y"还是小写的"y",结果都被视为肯定。肯定打印True。
ret = input('[请输入"Y"或"N"]')
print(ret.upper() == 'Y')
3、下面是一个email邮件格式的字符串,将其中的任务ID,任务名称,执行时间,执行耗时,执行状态等值由用户引导输入嵌入到该模板中
"""<html>
<head>
<meta charset="utf-8">
</head>
<body>
Hello,定时任务出错了:
<p style="font-size:16px;">任务执行详情:</p>
<p style="display:block; padding:10px; background:#efefef;border:1px solid #e4e4e4">
任务 ID:1001<br/>
任务名称:定时检测订单<br/>
执行时间:2012-12-12<br/>
执行耗时:15秒<br/>
执行状态:开启
</p>
<br/>
<p>-----------------------------------------------------------------<br/>
本邮件由CronJob定时系统自动发出,请勿回复<br/>
如果要取消邮件通知,请登录到系统进行设置<br/>
</p>
</body>
</html>"""
task_id = 1001
task_name = "定时检测订单"
task_date = "2012-12-12"
task_cost_second = 15
email_str = f"""<html>
<head>
<meta charset="utf-8">
</head>
<body>
Hello,定时任务出错了:
<p style="font-size:16px;">任务执行详情:</p>
<p style="display:block; padding:10px; background:#efefef;border:1px solid #e4e4e4">
任务 ID:{task_id}<br/>
任务名称:{task_name}<br/>
执行时间:{task_date}<br/>
执行耗时:{task_cost_second}秒<br/>
执行状态:开启
</p>
<br/>
<p>-----------------------------------------------------------------<br/>
本邮件由CronJob定时系统自动发出,请勿回复<br/>
如果要取消邮件通知,请登录到系统进行设置<br/>
</p>
</body>
</html>"""
print(email_str)
【复习】4、names='yuan rain eric alvin'
,引导用户输入一个名字,判断是否在这个名字字符串中,是打印True,不是打印False
your_name = input("输入你的人名称")
names = 'yuan rain eric alvin'
print(names.find(your_name) != -1)
# 搞复杂了,直接用in就行
print(your_name in names)
【复习】5、引导用户输入一个双值加法字符串,例如3+5
或3 + 5
,计算出两个数字的和,打印出来
expression = input("请输入一个双值加法字符串,例如 3+5 或者 3 + 5")
nums = expression.split("+")
num1 = int(nums[0].strip())
num2 = int(nums[1].strip())
print(f"结果是:{num1 + num2}")
# 但实际是python的内置函数int可以自动处理空格
print(int(" 1 "))
【复习】6、用户输入一个11位手机号,将第5位至第8位替换成*
phone_number = input("请输入11位手机号")
print(phone_number[:4] + "****" + phone_number[8:])
# 可以这样
print(phone_number.replace(phone_number[4:8], "*" * 4))
7、编写一个Python程序,输入一个三位数。将其拆分为百位数,十位数和个位数,井输出它们的和
num_str = input("请输入一个三位数").strip()
# num1 = num // 100
# num2 = num % 100 // 10
# num3 = num % 10
# print(f'百位是:{num1},十位是:{num2},个位是:{num3}')
# print(num1 + num2 + num3)
ge = int(num_str[0])
shi = int(num_str[1])
bei = int(num_str[2])
print(ge+shi+bei)
8、将Unix/Linux
系统下的路径字符串"/Users/yuan/npm/index.js"
转换为Windows
系统下的路径字符串"\Users\yuan\npm\index.js"
。请使用两种方式来实现路径转换
linux_path_str = "/Users/yuan/npm/index.js"
print(linux_path_str.replace("/", "\\"))
print(r"\Users\yuan\npm\index.js")
# 方法二
print("\\".join(linux_path_str.split("/")))
9、引导用户输入一个字符串,判断是否是回文字符串
s = input("请输入字符串")
if s == s[::-1]:
print("是回文字符串")
else:
print("不是回文字符串")
10、引导用户输入一个字符串,保证长度一定是4的倍数,不足位补=
s = input("请输入字符串")
mod = len(s) % 4
if mod != 0:
s= s + ("=" * (4 - mod))
print(s)
11、引导用户输入一个手机号,通过一个逻辑表达式判断该字符串是否符合电信手机号格式,格式要求如下,是打印True,不是打印False
# 要求1: 输入的长度必须是11位
# 要求2: 输入内容必须全部是数字
# 要求3: 前三位是133或153(电信号段)
s = input("请输入手机号")
print(len(s) == 11 and s.isdigit() and (s.startswith("133") or s.startswith("153")))
12、引导用户输入一个邮箱格式字符串,比如916852314@163.com
或1052065088@qq.com
等,然后将邮箱号和邮箱类型名打印出来,比如邮箱号916852314
和163邮箱
email = input("请输入邮箱")
strs = email.split("@")
email_code = strs[0]
email_type = strs[1].split(".")[0]
print(email_code)
print(email_type)
【错题】13、HTTP协议格式数据组装,引导用户分别输入请求方式,请求URL以及若干个请求头
请输入 HTTP 请求方法:GET
请输入 URL:https://www.example.com/api/data
请输入 HTTP 协议:HTTP/1.1
请输入请求头信息(键值对用冒号分隔,多个键值对用逗号分隔):User-Agent: MyClient/1.0,Authorization: Token abcdef123456
HTTP请求协议组装格式:请求方法,请求URL的路径以及请求协议名放在第一行,每一个请求头的键值对占一行,提示:换行用\n
,打印格式如下
GET /api/data HTTP/1.1
User-Agent: MyClient/1.0
Authorization: Token abcdef123456
```python
method = input("请输入HTTP请求方式")
url = input("请输入URL")
proto_name = input("请输入HTTP协议")
headers = input("请输入请求头(键值对用冒号分隔,多个键值对用逗号分隔)")
headers = "\n".join(headers.split(","))
print("=======================================")
content = f"""{method.upper()} {url} {proto_name.upper()}
{headers}
"""
print(content)
# 要注意的是f-string里面不能有\转义字符!!!
这个题URL我这里就没有处理了,真的要处理可以用urlparse库