1、字符串简介:
字符串(即不能修改的字符list)字符串是一个整体。如果你想直接修改字符串的某一部分,是不可能的。但我们能够读出字符串的某一部分。进行子字符串的提取。
2、字符串的操作:
2.1 字符串的赋值定义、子字符串
字符串的赋值与定义:
string_test = "Hello My Friend"
子字符串的提取:
可以使用方括号来截取字符串
string_test = "Hello My Friend"
srring_test_sub = string_test[:6]
2.2 字符串运算符
下表实例变量a值为字符串 “Hello”,b变量值为 “Python”:
操作符 | 描述 | 实例 |
---|---|---|
+ | 字符串连接 | a + b 输出结果: HelloPython |
* | 重复输出字符串 | a*2 输出结果:HelloHello |
[] | 通过索引获取字符串中字符 | a[1] 输出结果 e |
[ : ] | 截取字符串中的一部分,遵循左闭右开原则,str[0,2] 是不包含第 3 个字符的。 | a[1:4] 输出结果 ell |
in | 成员运算符 - 如果字符串中包含给定的字符返回 True | ’H’ in a 输出结果 True |
not in | 成员运算符 - 如果字符串中不包含给定的字符返回 True | ’M’ not in a 输出结果 True |
r/R | 原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r(可以大小写)以外,与普通字符串有着几乎完全相同的语法。 | print( r'\n' ) print( R'\n' ) |
% | 格式字符串 | 请看下一节内容。 |
2.3 字符串的内置函数:
len(string) # 返回字符串长度
max(str)#返回字符串 str 中最大的字母
min(str)#返回字符串 str 中最小的字母
cmp(“my friend”, str) #字符串比较。第一个大,返回1
2.4 字符串的转换:
oat(str) #变成浮点数,float(“1e-1″) 结果为0.1
int(str) #变成整型, int(“12″) 结果为12
int(str,base) #变成base进制整型数,int(“11″,2) 结果为2
long(str) #变成长整型,
long(str,base) #变成base进制长整型
2.5 字符串的分割与拼接:
分割:
str.partition(s) # 用s将str切分成三个值
str.split(s[, num]) # 以s为分隔符切片str num=string.count(str)) 以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串
str.splitlines([keepends]) # 按照行分隔,返回一个包含各行作为元素的列表.按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
str.rpartition(s) # 类似于 partition()函数,不过是从右边开始查找
拼接:
join(seq) # 以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
s1 = "-"
s2 = ""
seq = ("r", "u", "n", "o", "o", "b") # 字符串序列
print (s1.join( seq ))
print (s2.join( seq ))
# r-u-n-o-o-b
# runoob
2.6 字符串查找、替换、索引、计数:
str.replace(a, b[,max]) # 将字符串str中的a替换成b 次数不超过max次数
str.count(s) # 返回字符串s在str中出现的次数
str.find(s) # 返回字符串s在字符串str中的位置索引,没有则返回-1
str.rfind(s) # 类似于 find()函数,不过是从右边开始查找
str.index(s) # 和find()方法一样,但是如果s不存在于str中则会抛出异常
str.rindex(s) # 类似于 index(),不过是从右边开始
字符映射表:
str.maketrans(intab, outtab)
str.translate(table)
bytes.translate(table[, delete])
bytearray.translate(table[, delete])
例子:
intab = "aeiou"
outtab = "12345"
trantab = str.maketrans(intab, outtab) # 制作翻译表
str = "this is string example....wow!!!"
print (str.translate(trantab))
# 输出 th3s 3s str3ng 2x1mpl2....w4w!!!
# 制作翻译表
bytes_tabtrans = bytes.maketrans(b'abcdefghijklmnopqrstuvwxyz', b'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
# 转换为大写,并删除字母o
print(b'runoob'.translate(bytes_tabtrans, b'o'))
# 输出 b'RUNB'
2.7 字符串的大小写和部分字符处理:
str.capitalize() # 把字符串的首字母大写
str.lower() # 转换str中所有大写字符为小写
str.strip() # 等于同时执行rstrip()和lstrip()
str.title() # 返回”标题化”的str,所有单词都是以大写开始,其余字母均为小写
str.upper() # 返回str所有字符为大写的字符串
str.center(width) # 将原字符串用空格填充成一个长度为width的字符串,原字符串内容居中
str.ljust(width) # 返回一个原字符串左对齐的并使用空格填充至长度width的新字符串
str.lstrip() # 去掉str左边的不可见字符
str.rstrip() # 去掉str右边的不可见字符
str.swapcase() # 将字符串中大写转换为小写,小写转换为大写
str.zfill(width) # 返回长度为 width 的字符串,原字符串str右对齐,前面填充0
str.rjust(width) # 返回一个原字符串右对齐的并使用空格填充至长度width的新字符串
expandtabs(tabsize=8) # 把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是8
2.8 字符串的编码解码:
str.decode(encoding=’UTF-8’,errors=’strict’) # 以指定编码格式解码字符串
str.encode(encoding=’UTF-8’,errors=’strict’) # 以指定编码格式编码字符串
bytes.decode(encoding="utf-8", errors="strict") # Python3 中没有 decode 方法,但我们可以使用 bytes 对象的 decode() 方法来解码给定的 bytes 对象,这个 bytes 对象可以由 str.encode() 来编码返回。
2.9 判断字符串的某种情况:
str.endswith(s) # 判断字符串str是否以字符串s结尾
str.isalnum() # 如果str至少有一个字符并且都是字母或数字则返回True,否则返回False
str.isalpha() # 如果str至少有一个字符并且都是字母则返回True,否则返回False
str.isdigit() # 如果str只包含数字则返回 True 否则返回 False
str.isdecimal() # 检查字符串是否只包含十进制字符,如果是返回 true,否则返回 false
str.islower() # 如果str存在区分大小写的字符,并且都是小写则返回True 否则返回False
str.isspace() # 如果str中只包含空格,则返回 True,否则返回 False
str.istitle() # 如果str是标题化的(单词首字母大写)则返回True,否则返回False
str.isupper() # 如果str存在区分大小写的字符,并且都是大写则返回True 否则返回False
str.startswith(s) # 检查字符串str是否是以s开头,是则返回True,否则返回False
3、字符串格式化
Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。
print ("我叫 %s 今年 %d 岁!" % ('小明', 10))
# 输出 我叫 小明 今年 10 岁!
3.1 python字符串格式化符号:
符 号 | 描述 |
---|---|
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串 |
%d | 格式化整数 |
%u | 格式化无符号整型 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | %f和%e的简写 |
%G | %f 和 %E 的简写 |
%p | 用十六进制数格式化变量的地址 |
3.2 格式化操作符辅助指令:
符号 | 功能 |
---|---|
* | 定义宽度或者小数点精度 |
- | 用做左对齐 |
+ | 在正数前面显示加号( + ) |
在正数前面显示空格 | |
# | 在八进制数前面显示零(‘0’),在十六进制前面显示’0x’或者’0X’(取决于用的是’x’还是’X’) |
0 | 显示的数字前面填充’0’而不是默认的空格 |
% | ‘%%‘输出一个单一的’%’ |
(var) | 映射变量(字典参数) |
m.n. | m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
4、字符串常量
需要import string
常数 | 含义 |
---|---|
string.ascii_lowercase | 小写字母’abcdefghijklmnopqrstuvwxyz’ |
string.ascii_uppercase | 大写的字母’ABCDEFGHIJKLMNOPQRSTUVWXYZ’ |
string.ascii_letters | ascii_lowercase和ascii_uppercase常量的连接串 |
string.digits | 数字0到9的字符串:’0123456789’ |
string.hexdigits | 字符串’0123456789abcdefABCDEF’ |
string.letters | 字符串’abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’ |
string.lowercase | 小写字母的字符串’abcdefghijklmnopqrstuvwxyz’ |
string.octdigits | 字符串’01234567’ |
string.punctuation | 所有标点字符 |
string.printable | 可打印的字符的字符串。包含数字、字母、标点符号和空格 |
string.uppercase | 大学字母的字符串’ABCDEFGHIJKLMNOPQRSTUVWXYZ’ |
string.whitespace | 空白字符 ‘\t\n\x0b\x0c\r ‘ |
5、转义字符
在需要在字符中使用特殊字符时,python用反斜杠()转义字符。如下表:
转义字符 | 描述 |
---|---|
(在行尾时) | 续行符 |
\ | 反斜杠符号 |
’ | 单引号 |
" | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数,yy代表的字符,例如:\o12代表换行 |
\xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
6、字符串模板Template
通过string.Template可以为Python定制字符串的替换标准,下面是具体列子:
from string import Template
s = Template('$who like $what')
print(s.substitute(who='i', what='python'))
# 输出 i like python
print(s.safe_substitute(who='i')) # 缺少key时不会抛错
# 输出 i like $what
print(Template('${who}LikePython').substitute(who='I')) # 在字符串内时使用{}
# 输出 ILikePython
Template还有更加高级的用法,可以通过继承string.Template, 重写变量delimiter(定界符)和idpattern(替换格式), 定制不同形式的模板。
import string
template_text = '''
Delimiter : $de
Replaced : %with_underscore
Ingored : %notunderscored
'''
d = {'de': 'not replaced',
'with_underscore': 'replaced',
'notunderscored': 'not replaced'}
class MyTemplate(string.Template):
# 重写模板 定界符(delimiter)为"%", 替换模式(idpattern)必须包含下划线(_)
delimiter = '%'
idpattern = '[a-z]+_[a-z]+'
print(string.Template(template_text).safe_substitute(d)) # 采用原来的Template渲染
print(MyTemplate(template_text).safe_substitute(d)) # 使用重写后的MyTemplate渲染
输出:
Delimiter : not replaced
Replaced : %with_underscore
Ingored : %notunderscored
Delimiter : $de
Replaced : replaced
Ingored : %notunderscored
原生的Template只会渲染界定符为$的情况,重写后的MyTemplate会渲染界定符为%且替换格式带有下划线的情况。
7、常用字符串技巧
7.1 反转字符串
>>> s = '1234567890'
>>> print s[::-1]
0987654321
7.2 关于字符串链接
尽量使用join()链接字符串,因为’+’号连接n个字符串需要申请n-1次内存,使用join()需要申请1次内存。
7.3 固定长度分割字符串
>>> import re
>>> s = '1234567890'
>>> re.findall(r'.{1,3}', s) # 已三个长度分割字符串
['123', '456', '789', '0']
7.4 使用()括号生成字符串
sql = ('SELECT count() FROM table '
'WHERE id = "10" '
'GROUP BY sex')
print sql
SELECT count() FROM table WHERE id = "10" GROUP BY sex
7.5 将print的字符串写到文件
>>> print >> open("somefile.txt", "w+"), "Hello World" # Hello World将写入文件somefile.txt