Python字符串类型及其操作
来自CloudWiki
目录
字符串类型的表示
- 字符串是字符的序列,表示快有一对单引号,双引号或三引号构成。其中单引号和双引号都可以表示单行字符串,三引号可以表示单行或者多行字符串。
- 打印字符串的python程序,运行结果如下,注意其中的引号部分。
>>> name = 'abc' >>> print(name) abc >>> name = "山东商职学院'云计算小组'" >>> print(name) 山东商职学院'云计算小组'
- input( )函数将用户输入的内容当作一个字符串类型,这是获得用户输入的常用方式。
- print( )函数可以直接打印字符串,这是输出字符串的常用方式。如:
>>> name = input("请输入名字: ") 请输入名字: Python语言 >>> print(name) Python语言 >>>
字符串的序号体系
- 字符串包括两种序号体系,正向递增序号和反向递减序号。
- 如果字符串长度为L,正向递增,序号以最左侧字符序号为零,向右依次递增,最右侧字符序号为L-1。反向递减虚号,以最右侧字符序号为-1,向左依次递减,最左侧字符序号为-L.
- Python字符串也提供区间访问方式,采用[N:M]格式,表示字符串中从n到m不包含m的子字符串。如果表示中M或者N索引缺失,则表示字符串把开始或结束索引值设为默认值。
>>> name = "Python语言程序设计" >>> print(name[0]) P >>> print(name[0],name[7],name[-1]) P 言 计 >>> print(name[2:-2]) thon语言程序 >>> print(name[:6]) Python >>> print(name[6:]) 语言程序设计 >>> print(name[:]) Python语言程序设计
- 反斜杠字符是一个特殊字符,在字符串中表示转义,即该字符与后面相邻的一个字符共同组成了新的含义。
>>> print("Python\n语言\t程序\t设计") Python 语言 程序 设计
基本的字符串操作符
- python提供了五个字符串的基本操作符,如:
- Python字符串支持加法运算符,表示两个字符串连接,生成新字符串。
>>> 'hello ' + 'world' 'hello world'
- 成员判断,关键字in
>>> "a" in "abcde" #测试一个字符中是否存在于另一个字符串中 True >>> 'ab' in 'abcde' True >>> 'ac' in 'abcde' #关键字in左边的字符串作为一个整体对待 False >>> "j" in "abcde" False
- Python字符串支持与整数的乘法运算,表示序列重复,也就是字符串内容的重复,得到新字符串。
>>> 'abcd' * 3 'abcdabcdabcd'
- str[i],索引,表示第i个字符
- str[N:M]切片,返回索引第N到M的子串,其中不包含M
- 例:截取身份证号第X位数字
内置的字符串处理函数
- python解释器提供了一些内置函数,处理字符串呢,非常方便。
>>> x = 'Hello world.' >>> len(x) #字符串长度 12 >>> max(x) #最大字符 'w' >>> min(x) ' ' >>> x=3.1415 >>> str(x) #返回x的字符串形式。 '3.1415' >>> chr(x) 返回Unicode编码对应的单字符 >>> ord('a')#返回某个字符所表示的Unicode编码。 97 >>> x= 11 >>> hex(x)#返回整数x对应的16进制字符串型。 '0xb' >>> oct(x)#返回整数x对应的八进制字符串形式。 '0o13'
- 例题:凯撒编码
plaincode = input("请输入明文: ") for p in plaincode: if ord("a") <= ord(p) <= ord("z"): print(chr(ord("a") + (ord(p) - ord("a") + 3)%26),end=) else: print(p, end=)
- 练习:针对凯撒编码写一个解密程序
字符串常用操作
- Python字符串对象提供了大量方法用于字符串的切分、连接、替换和排版等操作,另外还有大量内置函数和运算符也支持对字符串的操作。
- 字符串对象是不可变的,所以字符串对象提供的涉及到字符串“修改”的方法都是返回修改后的新字符串,并不对原始字符串做任何修改,无一例外。
- find()和rfind方法分别用来查找一个字符串在另一个字符串指定范围(默认是整个字符串)中首次和最后一次出现的位置,如果不存在则返回-1;
- index()和rindex()方法用来返回一个字符串在另一个字符串指定范围中首次和最后一次出现的位置,如果不存在则抛出异常;
count()方法用来返回一个字符串在当前字符串中出现的次数。
>>> s="apple,peach,banana,peach,pear" >>> s.find("peach") 6 >>> s.find("peach",7) 19 >>> s.find("peach",7,20) -1 >>> s.rfind('p') 25 >>> s.index('p') 1 >>> s.index('pe') 6 >>> s.index('pear') 25 >>> s.index('ppp') Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> s.index('ppp') ValueError: substring not found >>> s.count('p') 5 >>> s.count('pp') 1 >>> s.count('ppp')
split()、rsplit()、partition()、rpartition()
- split()和rsplit()方法分别用来以指定字符为分隔符,把当前字符串从左往右或从右往左分隔成多个字符串,并返回包含分隔结果的列表;
- partition()和rpartition()用来以指定字符串为分隔符将原字符串分隔为3部分,即分隔符前的字符串、分隔符字符串、分隔符后的字符串,如果指定的分隔符不在原字符串中,则返回原字符串和两个空字符串。
>>> s = "apple,peach,banana,pear" >>> s.split(",") ["apple", "peach", "banana", "pear"] >>> s.partition(',') ('apple', ',', 'peach,banana,pear') >>> s.rpartition(',') ('apple,peach,banana', ',', 'pear') >>> s.rpartition('banana') ('apple,peach,', 'banana', ',pear') >>> s = "2017-10-31" >>> t = s.split("-") >>> print(t) ['2017', '10', '31'] >>> print(list(map(int, t))) [2017, 10, 31]
- split()和rsplit()方法还允许指定最大分割次数。
>>> s = '\n\nhello\t\t world \n\n\n My name is Dong ' >>> s.split(None, 1) ['hello', 'world \n\n\n My name is Dong '] >>> s.rsplit(None, 2) ['\n\nhello\t\t world \n\n\n My name', 'is', 'Dong'] >>> s.split(maxsplit=6) ['hello', 'world', 'My', 'name', 'is', 'Dong'] >>> s.split(maxsplit=100) #最大分隔次数大于可分隔次数时无效 ['hello', 'world', 'My', 'name', 'is', 'Dong']
- 对于split()和rsplit()方法,如果不指定分隔符,则字符串中的任何空白符号(空格、换行符、制表符等)都将被认为是分隔符,把连续多个空白字符看作一个分隔符。
>>> s = 'hello world \n\n My name is Dong ' >>> s.split() ['hello', 'world', 'My', 'name', 'is', 'Dong'] >>> s = '\n\nhello world \n\n\n My name is Dong ' >>> s.split() ['hello', 'world', 'My', 'name', 'is', 'Dong'] >>> s = '\n\nhello\t\t world \n\n\n My name\t is Dong ' >>> s.split() ['hello', 'world', 'My', 'name', 'is', 'Dong']
- 然而,明确传递参数指定split()使用的分隔符时,情况是不一样的。
>>> 'a,,,bb,,ccc'.split(',') #每个逗号都被作为独立的分隔符 ['a', , , 'bb', , 'ccc'] >>> 'a\t\t\tbb\t\tccc'.split('\t') #每个制表符都被作为独立的分隔符 ['a', , , 'bb', , 'ccc'] >>> 'a\t\t\tbb\t\tccc'.split() #连续多个制表符被作为一个分隔符 ['a', 'bb', 'ccc']
join()
- 字符串连接join()
>>> li = ["apple", "peach", "banana", "pear"] >>> ','.join(li) 'apple,peach,banana,pear' >>> '.'.join(li) 'apple.peach.banana.pear' >>> '::'.join(li) 'apple::peach::banana::pear'
- 问题解决:使用split()和join()方法删除字符串中多余的空白字符,连续多个空白字符只保留一个。
>>> x = 'aaa bb c d e fff ' >>> ' '.join(x.split()) #使用空格作为连接符 'aaa bb c d e fff' >>> def equavilent(s1, s2): #判断两个字符串在Python意义上是否等价
if s1 == s2: return True elif ' '.join(s1.split()) == ' '.join(s2.split()): return True elif .join(s1.split()) == .join(s2.split()): return True else: return False
>>> equavilent('pip list', 'pip list') True
lower()、upper()、capitalize()、title()、swapcase()
- lower()、upper()、capitalize()、title()、swapcase()
>>> s = "What is Your Name?" >>> s.lower() #返回小写字符串 'what is your name?' >>> s.upper() #返回大写字符串 'WHAT IS YOUR NAME?' >>> s.capitalize() #字符串首字符大写 'What is your name?' >>> s.title() #每个单词的首字母大写 'What Is Your Name?' >>> s.swapcase() #大小写互换 'wHAT IS yOUR nAME?'
replace()、maketrans()、translate()
- 查找替换replace(),类似于Word中的“全部替换”功能。
>>> s = "中国,中国" >>> print(s) 中国,中国 >>> s2 = s.replace("中国", "中华人民共和国") #两个参数都作为一个整理 >>> print(s2) 中华人民共和国,中华人民共和国
- 问题解决:测试用户输入中是否有敏感词,如果有的话就把敏感词替换为3个星号***。
>>> words = ('测试', '非法', '暴力', '话') >>> text = '这句话里含有非法内容' >>> for word in words: if word in text: text = text.replace(word, '***') >>> text '这句***里含有***内容'