字符串详解

python的字符串详解

1.1 字符串的概念

常见的字符的编码有ASCII、Unicode、utf-8。

以下是常见的ASCII编码:

代表字符 码值 十六进制
a 97 0x61
A 65 0x41
z 122 0x7A
Z 90 0x5A
0 48 0x30
9 57 0x39
空格 32 0x20
换行 10 0x0A
回车 13 0x0D

Unicode的编码范围0x0000~0x10FFFF,utf-8是Unicode的变体,用可变的长度编码字符,包括传统的ASCII码用1个字节储存,中文用3个字节储存。utf-8在Unicode的基础上增加了标记位,使用标记位用来确定需要几个字节空间:

Unicode范围 utf-8编码
1-127 0XXXXXXX
128-2047 110XXXXX 10XXXXXX
2048-65535 1110XXXX 10XXXXXX 10XXXXXX
65536-1114111 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX

一下以“我”为例,Unicode编码是6211,在上表第三行的位置,需要utf-8需要3个字节存储,6211的二进制是01100010 00010001,加上标记为就是==1110==0110 ==10==001000 ==10==010001, 用十六进制表示就是0xE68891。

python默认的编码是utf-8,一下代码打印默认编码,意味着py文件以utf-8的储存形式储存。

1
2
import sys
sys.getdefaultencoding() #'utf-8'

1.2 str和bytes对象

1.2.1 str对象在python3.13文档中的定义如下:

Textual data in Python is handled with str objects, or strings. Strings are immutable sequences of Unicode code points.

定义为str对象也就是字符串用来处理文本数据,是由Unicode码位(code points)构成的不可变序列。除非改变默认编码的形式,以下为英文字母和中文的存储形式:

1
2
3
4
'a' # 0x61
'hello world' # 0x68 0x65 0x6C 0x6C 0x6F 0x20 0x77 0x6F 0x72 0x6C 0x64
'我' # 0xE6 0x88 0x91
'中国' # 0xE4 0xB8 0xAD 0xE5 0x9B 0xBD

1.2.2 字符串的字面值(literal):

由可选项前缀+双引号或单引号内的字面值组成。可选项前缀:"r" | "u" | "R" | "U" | "f" | "F" |"b" | "B",特殊前缀 "b" | "B" 为bytes对象的特定前缀。"r" | "R"用于禁用转义;"u" | "U" 用于Unicode字符串,python3以后少用;"f" | "F" 用于格式化字符串。若要多行显示字符串,要用到'\'分隔开。

str构造函数:

class str(object='') //针对非bytes对象 class str(object=b'', encoding='utf-8', errors='strict') //针对bytes对象

1.3 字符串常用方法

1.3.1 与大小写有关:

1
2
3
4
5
6
7
8
9
10
11
#upper()和lower()返回一个原字符串所有字母都转换大小写的新字符串
>>> spam = 'Hello world!'
>>> spam.upper()
'HELLO WORLD!'
>>> spam.lower()
'hello world!'
#isupper()和islower()返回判断时候所有字符是大小写的布尔值
>>> 'HELLO'.isupper()
True
>>> spam.islower()
False

1.3.2 isX()方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#isalpa()判断字符串是否只包含字符
>>> 'hello'.isalpha()
True
#isalnum()判断字符串是否只包含字符和数字
>>> 'hello123'.isalpha()
False
>>> 'hello123'.isalnum()
True
>>> 'hello'.isalnum()
True
#isdecimal()判断字符串是否只包含数字
>>> '123'.isdecimal()
True
#isspace()判断字符串是否只包含空格、制表符和换行符
>>> ' '.isspace()
True
#istitle()判断字符串是否以大写字符开头,后面都是小写的单词、数字或空格
>>> 'This Is Title'.istitle()
True

1.3.3 startwith()endwith()方法:

1
2
3
4
5
6
7
8
#用于判断字符串是否以传入的字符串开始或结尾
>>> spam = 'Hello world!'
>>> spam.startwith('Hello')
True
>>> spam.endwith('world!')
True
>>> 'abc123'.startwith('abcdef')
False

1.3.4 join()split()方法:

1
2
3
4
5
6
7
8
9
10
#join()用于将一个字符串列表或元组合并成一个新字符串,用调用的字符串相隔开
>>> ', '.join(['cats', 'rats', 'bats'])
'cats, rats, bats'
>>> ' '.join(['My', 'name', 'is', 'Jack'])
'My name is Jack'
#split()将一个字符串分拆成一个列表,默认分拆字符串为空白字符
>>> 'My name is Jack'.split()
['My', 'name', 'is', 'Jack']
>>> 'cats, rats, bats'.split(', ')
['cats', 'rats', 'bats']

1.3.5 partition()方法:

1
2
3
4
5
6
7
8
9
10
#partition()将一个字符串分割成以传入的参数字符串为分割,返回3个字符串的元组
>>> 'Hello, world!'.partition('world')
('Hello, ', 'world', '!')
#如果传入的分隔符找不到,则返回的第一个字符串是整个字符串,后两个为空
>>> 'Hello, world!'.partition('XYZ')
('Hello, world!', '', '')
#可以利用多重赋值技巧
>>> str1, str2, str3 = 'Hello, world!'.partition('world')
>>> str1
'Hello, '

1.3.6 rjust()ljust()center()方法:

1
2
3
4
5
6
7
8
9
10
#这三个函数用三种不同的方式将传进来的字符参数填充调用的字符串,默认是空格
>>> spam = 'hello'
>>> spam.rjust(10)
' hello'
>>> spam.ljust(20)
'hello '
>>> spam.ljust(10, '#')
'hello######'
>>> spam.center(20, '=')
'========hello========'

1.3.7 rstrip()lstrip()strip()方法:

1
2
3
4
5
6
7
8
##这三个函数用三种不同的方式将传进来的字符参数分割调用的字符串,默认是空格
>>> spam = ' hello '
>>> spam.strip()
'hello'
>>> spam.lstrip()
'hello '
>>> spam.rstrip()
' hello'

1.3.8 ord()chr()方法:

1
2
3
4
5
6
#ord()返回一个字符的Unicode码位(coding point),以十进制表示
#chr()以传进的码位返回一个字符
>>> ord('A')
65
>>> chr(65)
'A'

1.4 字符串的格式化输出

1.4.1 C风格的格式化输出

1
2
3
4
5
6
7
>>> a = 'lisa'
>>> b = 'joe'
>>> print('%s eated %s' % (a, b)) # lisa eated joe
>>> print("%s asked %s to do something in %d time" % (a, b, 10)) # lisa asked joe to do something in 10 time
# 也可以通过字典方式格式化,打破了位置带来的限制与困扰
>>> kwargs = {"name": "lisa", "age": 18}
>>> print("my name is %(name)s, my age is %(age)d" % (kwargs) # my name is lisa, my age is 18

1.4.2 python风格的格式化输出

1
2
3
4
5
6
7
8
9
#由python3.6版本引入的一个特性,称之为字面量格式化字符串,以F或者f开头,后面跟字符串,字符串中的表达式用大括号{}包起来,它会将变量或表达式计算后的值替换进去,是以f或F开头的字符串, 核心在于字符串中符号{}的使用
>>> name = ‘lisa’
>>> print(f"my name is {name}") # my name is lisa
>>> print(F"my name is {name.upper()}") # my name is LISA
#可以在{}中放置任意合法的表达式,会在运行时计算
>>> print(f"{3 * 3 / 2}") # 4.5
>>> a = 1
>>> b = 2
>>> print(f"a + b = {a + b}") # a + b = 3

1.4.3 format内建函数的输出

1
2
3
4
5
#内置函数format()方法将占位符替换为值,是一种灵活的字符串格式设置方法。此方法在 Python 2 和 Python 3 中都可使用,使其成为需要代码与两个版本兼容的不错选择。在字符串中,可以使用大括号定义占位符。然后在字符串上调用该方法,并提供参数作为替换占位符的
>>> name = "Lisa"
>>> age = 13
>>> formatted_string = "My name is {},and I'm {} year old" .format(name, age)
>>>print(formatted_string) #My name is Lisa,and I'm 13 year old