在内容开始之前,先来提出这样的设想,根据以往的经验(如果你学习过一门编程语言的话),我们对一个字符串的操作有哪些可能,尽可能的列举出来,然后再来对比一下在Python中是如何做的。比如,可能想到的字符串操作有:字符串连接,字符串拷贝,字符串比较,字符串截取,字符串大小写转换等等。有了这些设想之后,再来看看Python是如何来实现的。
1) 字符串的表现方式:'abc', "abc", '''abc, """abc""", 都可用来表式字符串: abc。当然三引号更多的用来做文档注释。
2) “原”字符串与Unicode字符串:r"This is String",在字符串前加r或R,表示该字符串是一个“原”字符串,“原”字符串中的转义字符功能将无效,但不能以转义字符结尾,如:
r'abc\' 这是个语法错误(SyntaxError: EOL while scanning string literal),Python 不允许以'\' 来结束字符串,即使是“原”字符串的情况下。如果一定要产生以 \ 结尾的字符串,
就使用 + 拼接:r'abc' + '\' 这样产生的字符串结果是:abc\
如果在字符串前加u或U,则是将字符串转换为Unicode字符串,如:u'Hello\u0020World',字符串中的 \u0020 Unicode码对应的ASCII码是空格。
3) 字符串的切片方式,字符串是由字符序列组成,所以可以使用切片来访问字符串:
str = 'My String'
str[3:]
str[:3]
或者用list 方法,将字符串的构建成一个列表,每个字符对应列表的每个元素,list[str]
5) 统计目标字符串在源字符串中出现的次数:haystack.count('needle'),haystack 是源字符串对象,'needle' 是目标字符串,它用来统计 needle 在haystack 中出现的次数。
6) 字符串的打散与拼接:split(), join()
str = 'Hello,World.'
str.split(',') #以',' 为分隔符,将字符串打散,并以列表形式返回结果,返回的结果中不包含分隔符
str = 'a+b,c'
'+'.join(str) # 以'+' 为分隔符,将每一个迭代的元素分隔再连接,返回的结果中包含该分隔符。这里返回:'a+++b+,+c',a,b中间的第1,3个'+'是连接符,而第2个才是原字符的'+',后面同理
l = ['a', 'b', 'c']
','.join(l) # 返回 'a,b,c',除了字符串,列表内的元素也可以连接 ,其实元组也可以用来join的,但要求一点是所有的元素类型必须是字符型。
7) 字符串比较,要比较两个字符串的大小,或者是否相等,可直接使用逻辑运算符比较:
a = 'abc'
b = 'abC'
a > b # True
a = 123
b = '123'
a > b # False
a = '1234'
b = '1234'
a == b # True
a is b # True
id(a) # 152699840, a, b 两个内存地址一样,它们引用了内存中同一个字符串常量
id(b) # 152699840
a = 'hello world.'
a[:10] # 'hello worl'
a[3:] # 'lo world.'
a[:] # 'hello world.',取整个字符串
a[:-1] # 'hello world',取首字符到倒数第1个字符,但不包含倒数第一个字符
9) 字符串反转
str = 'hello world'
str[::-1] # 逐字反转,返回 'dlrow olleh'
' '.join(str.split()[::-1]) # 逐词反转,返回'world hello'
' '.join(reversed(str.split())) # 功能同上
10) 字符与ASCII码之间的转换:ord, chr。ord() 将字符转换成ASCII码,chr() 是将ASCII码转换为字符
ord('a') # 返回ASCII码:97
chr(97) # 返回ASCII码97对应的字符:a
在不清楚字符或忘记字符串的某个方法时,可以用Python的内省功能:dir()函数,dir函数列出字符串当前可用的方法,但这只列出方法名,想知道具体方法功能描述,可用 help()函数,如:
str = 'abc'
dir(str) # 列出当前字符串可用方法名
help(str.upper) # 显示字符串upper()方法的功能
还可以查询Python的documentation:https://www.python.org/doc/
要判断一个对象是否为类字符串,用两种方法:
1) 使用basestring类的内建方法instance()。注:basestring 类是str和unicode的父类,这个类不能被调用或实例化,只能用来判断一个对象是否是str或unicode的实例。
def isString(var):
return isinstance(var, basestring)
isString('a') # True
由于basestring类不包含 UserString类,所以,如果字符串是由UserString类实例化的,就不灵了!
import UserString
str = UserString.UserString('abc')
isString(str) # False
def isStringLike(var):
try: var + ''
except: return False
else: return True
isStringLike('a') # True
str = UserString.UserString('abc')
isStringLike(str) # True