|
|
第111行: |
第111行: |
| *拓展:http://blog.csdn.net/by4_Luminous/article/details/53343780 | | *拓展:http://blog.csdn.net/by4_Luminous/article/details/53343780 |
| | | |
− | ==字符串常用操作==
| + | 下一节 [[Python字符串常用操作]] |
− | *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部分,即分隔符前的字符串、分隔符字符串、分隔符后的字符串,如果指定的分隔符不在原字符串中,则返回原字符串和两个空字符串。
| |
− | <nowiki>>>> 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]</nowiki>
| |
− | *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
| |
− | '这句***里含有***内容'
| |
− | *字符串对象的maketrans()方法用来生成字符映射表,而translate()方法用来根据映射表中定义的对应关系转换字符串并替换其中的字符,使用这两个方法的组合可以同时处理多个字符。
| |
− | #创建映射表,将字符"abcdef123"一一对应地转换为"uvwxyz@#$"
| |
− | >>> table = ''.maketrans('abcdef123', 'uvwxyz@#$')
| |
− | >>> s = "Python is a greate programming language. I like it!"
| |
− | #按映射表进行替换
| |
− | >>> s.translate(table)
| |
− | 'Python is u gryuty progrumming lunguugy. I liky it!'
| |
− | *问题解决:凯撒加密,每个字母替换为后面第k个。
| |
− | >>> import string
| |
− | >>> def kaisa(s, k):
| |
− | lower = string.ascii_lowercase #小写字母
| |
− | upper = string.ascii_uppercase #大写字母
| |
− | before = string.ascii_letters
| |
− | after = lower[k:] + lower[:k] + upper[k:] + upper[:k]
| |
− | table = ''.maketrans(before, after) #创建映射表
| |
− | return s.translate(table)
| |
− | | |
− | >>> s = "Python is a greate programming language. I like it!"
| |
− | >>> kaisa(s, 3)
| |
− | 'Sbwkrq lv d juhdwh surjudpplqj odqjxdjh. L olnh lw!'
| |
− | ===strip()、rstrip()、lstrip()===
| |
− | *strip()、rstrip()、lstrip()
| |
− | >>> s = " abc "
| |
− | >>> s.strip() #删除空白字符
| |
− | 'abc'
| |
− | >>> '\n\nhello world \n\n'.strip() #删除空白字符
| |
− | 'hello world'
| |
− | >>> "aaaassddf".strip("a") #删除指定字符
| |
− | 'ssddf'
| |
− | >>> "aaaassddf".strip("af")
| |
− | 'ssdd'
| |
− | >>> "aaaassddfaaa".rstrip("a") #删除字符串右端指定字符
| |
− | 'aaaassddf'
| |
− | >>> "aaaassddfaaa".lstrip("a") #删除字符串左端指定字符
| |
− | 'ssddfaaa'
| |
− | *这三个函数的参数指定的字符串并不作为一个整体对待,而是在原字符串的两侧、右侧、左侧删除参数字符串中包含的所有字符,一层一层地从外往里扒。
| |
− | >>> 'aabbccddeeeffg'.strip('af') #字母f不在字符串两侧,所以不删除
| |
− | 'bbccddeeeffg'
| |
− | >>> 'aabbccddeeeffg'.strip('gaf')
| |
− | 'bbccddeee'
| |
− | >>> 'aabbccddeeeffg'.strip('gaef')
| |
− | 'bbccdd'
| |
− | >>> 'aabbccddeeeffg'.strip('gbaef')
| |
− | 'ccdd'
| |
− | >>> 'aabbccddeeeffg'.strip('gbaefcd')
| |
− | ''
| |
− | ===startswith()、endswith()===
| |
− | *s.startswith(t)、s.endswith(t),判断字符串是否以指定字符串开始或结束
| |
− | >>> s = 'Beautiful is better than ugly.'
| |
− | >>> s.startswith('Be') #检测整个字符串
| |
− | True
| |
− | >>> s.startswith('Be', 5) #指定检测范围起始位置
| |
− | False
| |
− | >>> s.startswith('Be', 0, 5) #指定检测范围起始和结束位置
| |
− | True
| |
− | >>> import os
| |
− | >>> [filename for filename in os.listdir(r'c:\\') if filename.endswith(('.bmp','.jpg','.gif'))]
| |
− | ===isalnum()、isalpha()、isdigit()、isdecimal()、isnumeric()、isspace()、isupper()、islower()===
| |
− | *isalnum()、isalpha()、isdigit()、isdecimal()、isnumeric()、isspace()、isupper()、islower(),用来测试字符串是否为数字或字母、是否为字母、是否为数字字符、是否为空白字符、是否为大写字母以及是否为小写字母。
| |
− | | |
− | >>> '1234abcd'.isalnum()
| |
− | True
| |
− | >>> '1234abcd'.isalpha() #全部为英文字母时返回True
| |
− | False
| |
− | >>> '1234abcd'.isdigit() #全部为数字时返回True
| |
− | False
| |
− | >>> 'abcd'.isalpha()
| |
− | True
| |
− | >>> '1234.0'.isdigit()
| |
− | False
| |
− | >>> '1234'.isdigit()
| |
− | True
| |
− | >>> '九'.isnumeric() #isnumeric()方法支持汉字数字
| |
− | True
| |
− | >>> '九'.isdigit()
| |
− | False
| |
− | >>> '九'.isdecimal()
| |
− | False
| |
− | >>> 'ⅣⅢⅩ'.isdecimal()
| |
− | False
| |
− | >>> 'ⅣⅢⅩ'.isdigit()
| |
− | False
| |
− | >>> 'ⅣⅢⅩ'.isnumeric() #支持罗马数字
| |
− | True
| |
− | ===center()、ljust()、rjust()、zfill()===
| |
− | *center()、ljust()、rjust(),返回指定宽度的新字符串,原字符串居中、左对齐或右对齐出现在新字符串中,如果指定宽度大于字符串长度,则使用指定的字符(默认为空格)进行填充。zfill()返回指定宽度的字符串,在左侧以字符0进行填充。
| |
− | >>> 'Hello world!'.center(20) #居中对齐,以空格进行填充
| |
− | ' Hello world! '
| |
− | >>> 'Hello world!'.center(20, '=') #居中对齐,以字符=进行填充
| |
− | '====Hello world!===='
| |
− | >>> 'Hello world!'.ljust(20, '=') #左对齐
| |
− | 'Hello world!========'
| |
− | >>> 'Hello world!'.rjust(20, '=') #右对齐
| |
− | '========Hello world!'
| |