07 字符串
字符串是一系列单个字符的有序序列(一个有序的字符的集合)。主要类型有:str、unicode。
Python字符串需要包括在单引号或双引号中(Python中,单引号或双引号代表着相同的东西),也可以包括在在三个引号(单引号或双引号)中。在三引号中,可以包括多行字符串常量。当采用这种形式的时候,所有的行都合并在一起,并在每一行的末尾增加换行符。
>>> msg="""aaa
... bbb''ccc'ddd""eee"fff
... ggg"""
>>> print msg
aaa
bbb''ccc'ddd""eee"fff
ggg
>>> msg
'aaa\nbbb\'\'ccc\'ddd""eee"fff\nggg'
Python还提供了各种编写字符串的方法,例如,用反斜线转义序列代表特殊字符。
常见的转移字符如下:
| 转义字符 | 描述 |
|---|---|
| \ | 忽视newline(续行) |
| \ | 反斜杠“\” |
| \’ | 单引号 |
| \” | 双引号 |
| \a | 响铃(alarm) |
| \b | 回退(backspace) |
| \f | 换页 |
| \n | 换行 |
| \r | 回车 |
| \t | 横向制表符(Tab) |
| \v | 纵向制表符 |
| \x | 十六进制值 |
说明:如果Python没有作为一个合法的转义编码识别出在“\”后的字符,它就直接在最终的字符串中保留反斜杠。
>>> str ='c:\py\code'
>>> str
'c:\\py\\code'
>>> print(str)
c:\py\code
如果要使字符串中的转义不生效,可以使用raw字符串来解决问题。如果字母r(大写或小写)出现在字符串的第一引号的前面,它将会关闭转义机制。这个结果就是Python会将反斜杠作为常量来保持,就像输入的那样。
>>> a='d:\new\test.py'
>>> print(a)
d:
ew est.py
>>> a=r'd:\new\test.py'
>>> print(a)
d:\new\test.py
除了这个方法可以使用“\”来代替反斜杠。
因为将字符串定义为字符的有序集合,所以我们能够通过其位置获得他们的元素。在Python中,字符串中的字符是通过索引(通过在字符串之后的方括号中提供所需要的元素的数字偏移量)提取的。你将获得在特定位置的一个字符的字符串。 就像在C语言中一样,Python偏移量是从0开始的,并比字符串的长度小1。与C语言不同,Python还支持类似在字符串中使用负偏移这样的方法从序列中获取元素。从技术上讲,一个负偏移与这个字符串的长度相加后得到这个字符串的正的偏移值。能够将负偏移看做是从结束处反向计数。

- 索引(S[i])获取特定偏移的元素:
第一个元素的偏移为0。
负偏移索引意味着从最后或右边反向进行计数,倒数第一个元素的负偏移索引为-1。
S[0]获取了第一个元素。
S[-2]获取了倒数第二个元素(就像S[len(s)-2]一样)。
- 分片(S[i:j])提取原字符串的一个字串,作为一个新的对象返回:
上边界并不包含在内。(上边界指的是右边的边界)
分片的边界默认为0和序列的长度,如果没有给出的话。
S[1:3]获取了从偏移为1的元素,直到但不包括偏移为3的元素。
S[1:]获取了从偏移为1直到末尾(偏移为序列长度)之间的元素。
S[:3]获取了从偏移为0直到但是不包括偏移为3之间的元素。
S[:-1]获取了从偏移为0直到但是不包括最后一个元素之间的元素。
S[:]获取了从偏移0到末尾之间的元素,这有效地实现顶层S拷贝。
- S[i:j:k] k指的是步进值(stride),缺省为1。步进值也可为负数。为是负数时,左边界要大于由边界。
字符串作为不可变对象,这意味着不可以在内存原处对字符串对象进行修改,所有的字符串方法都不改变原字符串的内容。那如何为一个引用了字符串的变量进行修改呢,我们采用重新赋值的方法。
1.1、使用str.replace()方法:
str.replace("xxx","yyy"[,maxreplace]) 子串替换,maxreplace为替换次数,缺省时,进行全局替换,不改变原字符串
>>> S='spammy'
>>> S.replace('mm','xx')
'spaxxy'
2.1、使用切片方式修改字符串:
>>> S='spammy'
>>> S = S[:3] + 'xx' + S[5:]
>>> S
'spaxxy'
str.upper() 将字符串中所有的字母转换为大写
str.lower() 将字符串中所有的字母转换为小写
str.capitalize() 首字符大写
>>> s1='Hello World'
>>> s1.upper()
'HELLO WORLD'
>>> s1.lower()
'hello world'
>>> s2='hello world'
>>> s2.capitalize()
'Hello world'
str.join(iterable) 使用字符串作为连接符,将迭代对象的所有元素连接成字符串
>>> list1=['hello','world',',','I','love','China']
>>> " ".join(list1)
'hello world , I love China'
>>> '*'.join(list1)
'hello*world*,*I*love*China'
str.split(sep=None, maxsplit=-1) 使用指定的分隔符delimeter将原字符串分割为列表
sep为分隔符字符串separator,缺省时为任意空白字符
maxsplit为最大分割次数,缺省为-1,即最大次数分割
>>> str="i love China"
>>> str.split()
['i', 'love', 'China']
>>> str="192.168.1.1"
>>> str.split(".")
['192', '168', '1', '1']
str.strip([chars]) 删除str字符串开始和结尾的指定字符(默认为空白字符,空白符包含\n等)
str.rstrip([chars]) 删除str字符串末尾(右边)的指定字符(默认为空白字符,空白符包含\n等)
str.lstrip([chars]) 删除str字符串首部(左边)的指定字符(默认为空白字符,空白符包含\n等)
注意:删除的是字符,而不是字符串
>>> str=' hello world '
>>> str.strip()
'hello world'
>>> str.strip(' hel')
'o world'
>>> str.strip('leh ')
'o world'
>>> str.lstrip(' h')
'ello world '
>>> str.rstrip(' ld')
' hello wor'
str.find(sub, start=None, end=None)返回子串首次出现的偏移值,未找到时返回-1。start和end指定查找范围,默认从前向后开始搜索全部字符串。
>>> str='xxxxSPAMxxxxSPAMxxxx'
>>> str.find('SPAM')
4
>>> where = str.find('SPAM')
>>> str[:where]+'EGGS'+str[(where+4):]
'xxxxEGGSxxxxSPAMxxxx'
str.index(sub, start=None, end=None)返回子串首次出现的偏移值,未找到时返回错误。start和end指定查找范围,默认从前向后开始搜索全部字符串
>>> str='Hello World'
>>> str.index('o')
7
>>> str.index('o')
4
>>> str.index('o',5,10)
7
>>> str.index('o',5,)
7
>>> str.index('o',5,6)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
str.isalpha() 判断字符串是全为字母。如果字符串至少有一个字符并且所有字符都是字母则返回True,否则返回 False。
str.isalnum() 字母数字
str.isdecimal()
str.isdigit()
str.isidentifier() 判断字符串是为合法的标识符(变量)
str.islower()
str.isnumeric() 判断字符串是全为数字
str.isprintable()
str.isspace() 判断字符串是为空白
str.istitle() 小写字母
str.isupper() 大写字母
补充:python中str函数isdigit、isdecimal、isnumeric的区别
str.endswith(subfix) 以subfix结尾
str.startswith(prefix) 以prefix结尾
string='my name is ljz'
print(string.center(50,'-')) 居中打印,占位50个字符,空位补“-”
定义字符串的3种引号不区分,三引号可以跨行引用,3引号可以是3个单引号也可以是3个双引号,3引号可以用来注释代码。
Python2中,str无法支持unicode编码,如果需要指定为unicode时,需要使用u指定标识。例如str1 = u"ljzsdut"
文档字串:模块、类、函数中的第1条语句是一个字符串时,该字符串成为文档字串。可以使用对象的__doc__属性来引用。文档字串也是语句,需要与其他语句保持缩进一致。跨行使用多行文档字串,使用三引号。
python中,不加引号的字串会被认为是变量,所以python中字符串必须使用引号,数字不使用引号,所以数字不能被用作变量名。
python中,单引号和双引号是等效的,这个可以让我们在不使用转移字符的情况下,可以让一个双引号所包含的字符串中嵌入单引号。
Python自动在任意的表达式中合并相邻的字符串常量,尽管可以简单地在它们之间增加+操作符来明确地表示这是一个合并操作,并且把这种形式放到圆括号中,就可以允许它跨越多行:
>>> a='hello ' 'world'
>>> print a
hello world
>>> b=('hello '
... 'world')
>>> print b
hello world