1. 字符串格式化符号
格式化字符 | 转换方式 |
%c | 转换成字符(ASCII码值,或者长度为一字符串) |
%r | 优先用repr()函数进行字符串转换 |
%s | 优先用str()函数进行字符串转换 |
%d / %i | 转换有符号十进制数 |
%u | 转换无符号十进制数 |
%o | 转换成无符号八进制数 |
%x/%X | (Unsigned)转换成无符号十六进制数(x/X代表转换后十六进制的大小写) |
%e/%E | 转换科学计数法(e/E控制输出e/E) |
%f/%F | 转换成浮点数(小数部分自然截断) |
%g/%G | %e 和%f/%E 和%F 的简写 |
%% | 输出% |
2. 字符串格式化操作符辅助指令
符号 | 作用 |
* | 定义宽度或者小数点精度 |
- | 用作左对齐 |
+ | 在正数前面显示加号 |
<sp> | 在正数前面显示空格 |
# | 在八进制前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于用的是'x'还是'X') |
0 | 显示的数字前面填充'0'而不是默认的空格 |
% | '%%'输出一个单一的'%' |
(var) | 映射变量(字典参数) |
m.n | m是显示的最小的宽度,n是小数点后面的倍数(如果可用的话) |
3. 字符串模板:更简单的替代品
字符串格式化操作符是Python 里面处理这类问题的主要手段,而且以后也是如此。然而它也不是完美的,其中的一个缺点是它不是那么直观,尤其对刚从C/C++转过来的Python 新手来说更是如此,即使是现在使用字典形式转换的程序员也会偶尔出现遗漏转换类型符号的错误,比如说,用了%(lang)而不是正确的%(lang)s.为了保证字符串被正确的转换,程序员必须明确的记住转换类型参数,比如到底是要转成字符串,整数还是其他什么类型.
新式的字符串模板的优势是不用去记住所有的相关细节的,而是像现在shell 风格的脚本语言里面那样使用美元符号($).
由于新式的字符串Template 对象的引进使得string 模块又重新活了过来,Template 对象有两个方法,substitute()和safe_substitute().前者更为严谨,在key 缺少的情况下它会报一个KeyError 的异常出来,而后者在缺少key 时,直接原封不动的把字符串显示出来.
>>> from string import Template
>>> s=Template('There are ${howmany} ${lang} Quotation Symbols')
>>> print s.substitute(lang='Python',howmany=3)
There are 3 Python Quotation Symbols
>>> print s.substitute(lang='C++',howmany=8)
There are 8 C++ Quotation Symbols
>>> print s.substitute(lang='C++')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/string.py", line 172, in substitute
return self.pattern.sub(convert, self.template)
File "/usr/lib64/python2.7/string.py", line 162, in convert
val = mapping[named]
KeyError: 'howmany'
>>> print s.safe_substitute(lang='C++')
There are ${howmany} C++ Quotation Symbols
>>>
4. 原始字符串操作符( r/R )
关于原始字符串的目的,在Python1.5 里面已经有说明,是为了对付那些在字符串中出现的特殊字符(下面的小节会介绍这些特殊字符)。在原始字符串里,所有的字符都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。
原始字符串的这个特性让一些工作变得非常的方便,比如正则表达式的创建(详见文档的re模块).正则表达式是一些定义了高级搜索匹配方式的字符串,通常是由代表字符,分组、匹配信息、变量名、和字符类等的特殊符号组成。正则表达式模块已经包含了足够用的符号。但当你必须插入额外的符号来使特殊字符表现的像普通字符的时候,你就陷入了“字符数字”的泥潭!这时原始字符串就会派上用场了.
除了原始字符串符号(引号前面的字母"r")以外,原始字符串跟普通字符串有着几乎完全相同的语法.
这个'r'可以是小写也可以是大写,唯一的要求是必须紧靠在第一个引号前.
在三个例子的第一个例子里面,我们需要一个反斜杠加一个'n'来而不是一个换行符.:
>>> '\n'接下来的例子里,我们打不开我们的README 文件了,为什么?因为 '\t'和'\r'被当成不在我们的文件名中的特殊符号,但它们实际上文件路径的中4 个独立的字符.
'\n'
>>> print '\n'
>>> r'\n'
'\\n'
>>> print r'\n'
\n
>>>
>>> f = open('C:\windows\temp\readme.txt', 'r')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
f = open('C:\windows\temp\readme.txt', 'r')
IOError: [Errno 2] No such file or directory: 'C:\\win- dows\\temp\readme.txt'
>>> f = open(r'C:\windows\temp\readme.txt', 'r')
>>> f.readline()
'Table of Contents (please check timestamps for last update!)\n'
5. 字符串类型内建函数
方法 | 描述 |
string.capitalize() | 把字符串的第一个字符大写 |
string.center(width) | 返回一个原字符串居中,并使用空格填充到长度width的新字符串 |
string.count(str,beg=0,end=len(string)) | 返回str在string里面出现的次数,如果beg或者end指定则返回指定范围内str出现的次数 |
string.decode(encoding='UTF-8',errors='strict') | 以encoding指定的编码格式解码string,如果出错默认报一个ValueError的异常,除非errors指定的是'ignore'或者'replace' |
string.encode(encoding='UTF-8',errors='strict') | 以encoding指定的编码格式编码string,如果出错默认报一个ValueError的异常 |
string.endswith(obj,beg=0,end=len(string)) | 检查字符串是否以obj结束,如果beg或者end指定则检查指定的范围内是否以obj结束,如果是,返回Tru,否则返回False. |
string.find(str,beg=0,end=len(string)) | 检测str是否包含在string中,如果beg和end指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1 |
string.index(str,beg=0,end=len(string)) | 跟find()方法一样,只不过如果str不在string中会报一个异常。 |
string.isalpha() | 如果string至少有一个字符并且所有字符都是字母则返回True |
string.isdecimal() | 如果string只包含十进制数字则返回True,否则返回False |
string.isdigit() | 如果string只包含数字则返回True,否则返回False |
string.islower() | 如果string中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回True |
string.isnumeric() | 如果string中只包含数字字符,则返回True |
string.isspace() | 如果string中只包含空格,则返回True |
string.istitle() | 如果string是标题化的(见title())则返回True |
string.isupper() | 如果string中包含一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回True |
string.join(seq) | Merges(concatenates)以string作为分隔符,将seq中所有的元素(的字符串表示)合并为一个新的字符串 |
string.ljust() | 返回一个原字符串左对齐,并使用空格填充到长度width的新字符串 |
string.lower() | 转换string中所有大写字符为小写 |
string.lstrip | 截掉string左边的空格 |
string.partition(str) | 有点像find()和split()的结合体,从str 出现的第一个位置起,把字符串string 分成一个3 元素的元组(string_pre_str,str,string_post_str),如果string 中不包含str 则string_pre_str == string. |
string.replace(str1,str2,num=string.count(str1)) | 把string中的str1替换成str2,如果num指定,则替换不超过num次 |
string.rfind(str,beg=0,end=len(string)) | 类似于find()函数,不过是从右边开始查找 |
string.rindex(str,beg=0,end=len(string)) | 类似于index()函数,不过是从右边开始查找 |
string.rjust(width) | 返回一个原字符串右对齐,并使用空格填充到长度width的新字符串 |
string.rpartition(str) | 类似于partition(),不过是从右边开始查找 |
string.split(str="",num=string.count(str)) | 以str为分隔符切片string,如果num有指定值,则仅分隔num个子字符串 |
string.splitlines(num=string.count('\n')) | 按照行分隔,返回一个包含各行作为元素的列表,如果num指定则仅切片num个行 |
string.startswith(obj,beg=0,end=len(string)) | 检查字符串是否是以obj 开头,是则返回True,否则返回False。如果beg 和end 指定值,则在指定范围内 |
string.strip([obj]) | 在string上执行lstring()和rstring() |
string.swapcase() | 翻转string中的大小写 |
string.title() | 返回"标题化"的string,就是说所有单词都是以大写开始,其余字母均为小写(见istitle()) |
string.translate(str,del="") | 根据str 给出的表(包含256 个字符)转换string 的字符,要过滤掉的字符放到del 参数中 |
string.upper() | 转换string中的小写字母为大写 |
string.zfill(width) | 返回长度为width 的字符串,原字符串string 右对齐,前面填充 |
6. 三引号
虽然你可以用单引号或者双引号来定义字符串,但是如果你需要包含诸如换行符这样的特殊字符时,单引号或者双引号就不是那么方便了。Python 的三引号就是为了解决这个问题的,它允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符.
三引号的语法是一对连续的单引号或者双引号(通常都是成对的用):
三引号让程序员从引号和特殊字符串的泥潭里面解脱出来,自始至终保持一小块字符串的格式是所谓的WYSIWYG(所见即所得)格式的。
一个典型的用例是,当你需要一块HTML 或者SQL 时,这时用字符串组合,特殊字符串转义
将会非常的繁琐.
>>> errHtml=''' <html><head><title>
... python</>'''
>>> errHtml
' <html><head><title>\npython</>'
>>> errHtml='<html><head><title>
File "<stdin>", line 1
errHtml='<html><head><title>
^
SyntaxError: EOL while scanning string literal
>>>
7. 字符串不变性
字符串是一种不可变数据类型。就是说它的值是不能被改变或修改的。这就意味着如果你想修改一个字符串,或者截取一个子串,或者在字符串的末尾连接另一个字符串等等,你必须新建一个字符串。
这听起来要比实际情况复杂.因为Python 替你管理内存,你根本不需要知道到底发生了什么,每次你修改一个字符串或者做一些改变字符串内容的操作时,Python 都会自动为你分配一个新串.在下面的例子里面,Python 分别为"abc"和"def"分配了空间,当进行连接操作时,Python 自动为新的字符串"abcdef"分配了空间.