"""__author__=胡兴航"""
# 1. capitalize
# str.capitalize() - 将字符串的第一个字母变为大写字母,其他字母变为小写字母
str1 = 'qwerrty'
print(str1.capitalize()) # Qwerrty
# 2. center
# str.center(width, fillchar) - 返回一个指定宽度,居中为对象字符串,其余部分用指定字符填充的字符串,默认用空格填充
str1 = 'qaz'
print(str1.center(10, '7')) # 777qaz7777
# 3. count
# str.count(char) - 统计str中char的出现次数
str1 = 'qwertqwert'
print(str1.count('q'))
# str.count(char, start=, end=) - 统计str中指定范围内char的出现次数
print(str1.count('q', 0, 3)) # 1
# 4. endswith
# str.endswith(suffix) - 确定字符串是否以指定的后缀结尾。 后缀可以是字符或字符串。 如果是,它将返回布尔值T,否则F
str1 = 'qwerty'
print(str1.endswith('y')) # True
# str.endswith(suffix, start=, end=) - 确定指定范围内的字符串部分是否以指定后缀结尾。
print(str1.endswith('y', 2, 4)) # False
# 5.find
# str.find(str, start=, end=) - 确定指定范围内的字符串是否包含指定的子字符串,如果有,则返回所在处的首个字符的索引值;若不存在,则返回-1。
# 不加范围则默认搜索整个字符串
str1 = 'qwertyqwerty'
print(str1.find('w')) # 1
print(str1.find('q', 2, 3)) # -1
# 6. index
# str.index(str, start=, end=) - 功能与find相同,区别在于如果没有找到则会报错
str1 = 'qwertyqwerty'
print(str1.index('w')) # 1
print(str1.index('q', 2, 3)) # ValueError: substring not found
# 7. isdigit
# str.isdigit() - 判断该字符串是否只由数字组成,是则返回True,不是则False
str1 = '197414'
str2 = '2d129a'
print(str1.isdigit()) # True
print(str2.isdigit()) # False
# 8. islower
# str.islower - 判断该字符串中的字母是否全由小写字母组成,是则返回True,不是则False
str1, str2, str3 = 'qwe', 'QWe', 'qwe123'
print(str1.islower()) # True
print(str2.islower()) # False
print(str3.islower()) # True
# 9. isnumeric
# str.isnumeric - 判断判断该字符串是否只由数字组成,是则返回True,不是则False。和isdigit区别在于罗马、汉字数字等同样符合要求
str1, str2, str3, str4 = '123', '一二三', '壹二三', '123hehe'
print(str1.isnumeric()) # True
print(str2.isnumeric()) # True
print(str3.isnumeric()) # True
print(str4.isnumeric()) # False
# 10. istitle
# str.istitle - 检测字符串中所有的单词拼写首字母是否为大写,且其他字母为小写。
# 如果字符串中所有的单词拼写首字母是否为大写,且其他字母为小写则返回 True,否则返回 False.
str1, str2, str3 = 'you shall not pass!', 'You Shall Not Pass!', 'You shall not pass!'
print(str1.istitle()) # False
print(str2.istitle()) # True
print(str3.istitle()) # False
# 11. isupper
# str.isupper - 检测字符串中是否至少包含一个字母,而且所有字母是否都为大写字母。是则返回 True,否则返回 False.
str1, str2, str3 = 'QWE123', 'Qwe123', '123'
print(str1.isupper()) # True
print(str2.isupper()) # False
print(str3.isupper()) # False
# 12. join
# str.join(seq) - 将seq中的元素用str连接
# 注意,seq中的元素也需要是字符串,才能和str连接
str1, seq1, seq2, seq3 = 'z', {'q': '1', 'w': '2'}, ['1', '1', '1', '1', '1'], [3, 3, 3, 3]
print(str1.join(seq1)) # 1z2z3
print(str1.join(seq2)) # 1z1z1z1z1
print(str1.join(seq3)) # TypeError: sequence item 0: expected str instance, int found
# 13. len
# len(seq) - 求字符串的长度、或者别的包含元素的容器的元素个数
seq1, seq2, seq3, seq4 = 'zxccv', [1, 2, 3], {3, 4, 5}, {1: "q", 2: "w"}
print(len(seq1)) # 5
print(len(seq2)) # 3
print(len(seq3)) # 3
print(len(seq4)) # 2
# 14. ljust
# str.ljust(width, fillchar) - 使str左对齐,并用fillchar填充str至指定长度,如果不指定fillchar则默认空格
str1 = 'zzz'
print(str1.ljust(10, '1')) # zzz1111111
print(str1.ljust(10)) # zzz
# 15. rjust
# str.rjust(width, fillchar) - 使str右对齐,并用fillchar填充str至指定长度,如果不指定fillchar则默认空格
str1 = 'zzz'
print(str1.rjust(10, '1')) # 1111111zzz
print(str1.rjust(10)) # zzz
# 16. lower
# str.lower() - 将str中所有大写字符转为小写字符
str1 = 'qwerYUIP'
print(str1.lower()) # qweryuip
# 17. strip
# str.strip(chars) - 删除str两端指定的chars,chars可以倒序匹配
str1 = '123adioqe321'
print(str1.strip('123')) # adioqe
# 若无法匹配到chars,则会返回原str
print(str1.strip('z')) # 123adioqe321
# 还可以部分匹配
print(str1.strip('z1')) # 23adioqe32
# 18. lstrip
# str.lstrip(chars) - 删除str左端指定的chars
str1 = '123world321'
print(str1.lstrip('123')) # world321
# 19. rstrip
# str.rstrip(chars) - 删除str右端指定的chars
str1 = '123world321'
print(str1.rstrip('123')) # 123world
# 20. maketrans
# str.maketrans(intab, outtab) - 将str中需要替换的intab部分的字符串替换成相应的映射outtab,并且替换是每个字符按顺序一一对应的,in和out长度相同
str1,intab, outtb = '198uio', '198', 'qwe'
transtab = str1.maketrans(intab, outtab)
print(str1.translate(transtab)) # qweuio
# 21. replace
# str.replace(old_str, new_str, n) - 将str中的old_str替换成new_str,n代表最大转换次数,不加n代表全部转换
str1 = 'woooohoooo'
print(str1.replace('o', 'i')) # wiiiihiiii
print(str1.replace('o', 'i', 2)) # wiioohoooo
# 22. rfind
# str.rfind(str1, start=, end=) - str中指定范围内,从尾端开始搜寻,返回str1最后一次出现的位置,如果没有找到则返回-1。不写start和end则搜寻整个str
str1, str2 = 'haha world!', 'ha'
print(str1.rfind(str2, 0, 2)) # 0
print(str1.rfind(str2)) # 2
# 23. rindex
# # # str.index(str, start=, end=) - 功能与index相同,区别在于从str尾端开始寻找,
str1 = 'well you can leave!'
print(str1.rindex('you')) # 5
# 由于是从右边开始搜寻的,you不在给定的下标范围呢,所以找不到
print(str1.rindex('you', 8, len(str1))) # ValueError: substring not found
# 24. split
# str.split(str1, n) - 以str1为断点将str分割为n+1段,n规定了分割n次,如果不写n则全部分割,并返回由分割剩余部分组成的列表
str1, str_split = 'qwe1rty1uio1pas', '1'
print(str1.split(str_split)) # ['qwe', 'rty', 'uio', 'pas']
print(str1.split(str_split, 1)) # ['qwe', 'rty1uio1pas']
# 25, splitlines
# str.splitlines(keepends) - 将str以换行符为切点切割,在输出结果里是否去掉换行符('\r', '\r\n', \n'),默认为 False,不包含换行符,如果为 True,则保留换行符。
print('ab c\n\nde fg\rkl\r\n'.splitlines()) # ['ab c', '', 'de fg', 'kl'] 默认为false,所以不保留换行符
print('ab c\n\nde fg\rkl\r\n')
"""
ab c
kl
"""
print('ab c\n\nde fg\rkl\r\n'.splitlines(True)) # ['ab c\n', '\n', 'de fg\r', 'kl\r\n']
# 26. startswith
# str.startswith(str1, start=, end=) - 确定str是否以str1作为开头,如果指定了范围则以范围内的str部分开始。正确返回true,错误则返回false
str1, sta_str = 'yoha world!', 'yo'
print(str1.startswith(sta_str)) # True
print(str1.startswith(sta_str, 3, len(str1))) # False
# 27. translate - 见20. maketrans方法
intab, outtab = 'aeiou', '12345'
transtab = str.maketrans(intab, outtab)
str1 = 'you shall love me'
print(str1.translate(transtab)) # y45 sh1ll l4v2 m2
# 28. upper
# str.upper() - 将str中的小写字母转换成大写字母
str1 = 'qwe123TYU嘿嘿嘿'
print(str1.upper()) # QWE123TYU嘿嘿嘿 非字母部分不受影响
# 29. zfill
# str.zfill(width) - 将str右对齐,并用0填充至wdth长度
str1 = 'qwe'
print(str1.zfill(5)) # 00qwe
print(str1.zfill(2)) # qwe 如果width<= str本身的长度,则输出原str
# 30. casefold
# str.casefold() - 消除大小写,也是转换成小写,与lower的不同之处在于lower只会转换英文字母,casefold还可以转换别的字母
str1 = 'HAHA WORLD ß!'
print(str1.casefold()) # haha world ss!
print(str1.lower()) # haha world ß!
"""
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
"""
# 31. expandtabs
# str.expandtabs(tablesize=n) - 将str中的每个制表符\t之前用空格代替,默认为8个空格
str1 = "this is\tstring example....wow!!!"
print("Original string: ", str1) # Original string: this is string example....wow!!!
# 32. format - 一种格式化函数,功能为传递参数
# 通过字典key值设置参数
dict1 = {'name': '胡兴航', 'revenue': '50,000$'}
print('名字:{name}, 月收入:{revenue}'.format(**dict1)) # 名字:胡兴航, 月收入:50,000$
# 通过列表索引设置参数
list1 = ['胡兴航', '50,000$']
print('名字:{0[0]}, 月收入:{0[1]}'.format(list1)) # 0是必须写的 # 名字:胡兴航, 月收入:50,000$
# 若参数未组成容器
# str1 = "{}{}{}".format("hello", "world")
# print('str1 = %s' % str1) # IndexError: Replacement index 2 out of range for positional args tuple - 替换索引值2超过了位置参数args组成的元组的范围(0,1)
str2 = "{1} {1}".format("hello", "world")
# 替换索引相同,则传递的参数相同
print('str2 = %s' % str2) # str2 = world world
str3 = "{1} {1} {0}".format("hello", "world")
# 替换索引不同,则传递的参数不同,且只要替换索引的范围不超过args元组的范围就可以多次传参
print('str3 = %s' % str3) # str3 = world world hello
str4 = '{} {}'.format('hello', 'world', 'you')
# 默认替换索引则与args元组的索引相同,但替换索引范围不可超过元组索引,否则会报错
print('str4 = %s' % str4) # str4 = hello world
# 32. partition
# str1.partition(str2) - 将str1以str2为切点进行分割,得到str2左边的字符串、str2、str2右边的字符串组成的三元元组
str1 = 'qw1qw1qw1'
print(str1.partition('1')) # ('qw', '1', 'qw1qw1') # 从字符串左边开始匹配,就算有多个str2,也只会切割第一个
# 33. rpartition
# str1.rpartition(str2) - 功能与partition类似,区别在于从str1左边开始匹配,其余相同
str1 = 'qw1qw1qw1qw'
print(str1.rpartition('1')) # ('qw1qw1qw', '1', 'qw')
# 34. removeprefix
# str.removeprefix(sub_str) - 如果str以sub_str开头,则移除sub_str,并将剩余的部分生成一个新的字符串。若无法匹配,则返回原str
str1 = 'hahaworld!'
print(str1.removeprefix('haha')) # world!
print(str1) # hahaworld! # 原字符串并未改变
print(str1.removeprefix('1haha')) # hahaworld!
# 35. removesuffix
# str.removesuff(sub_str) - 匹配str是否以sub_str结尾,其余与removeprefix相同
str1 = 'hahaworld'
print(str1.removesuffix('ld')) # hahawor
# 36. isprintable
# str.isprintable() - 判断str中所有字符是否可以打印(不可打印的字符可以是回车和换行符),能则返回true,不能则返回false,空串判断为true
str1 = '' \
'\n'
print(str1.isprintable()) # False
str2 = ''
print(str2.isprintable()) # True
# 37. isidentifier
# str.isidentifier - 判断str是否是有效标识符(可以作为变量名字),是则返回true,否则返回false。标识符不能用数字开头、不能有空格
print('is'.isidentifier()) # True # 虽然不建议用is作为标识符,但是可以用
print('name'.isidentifier()) # True
print('1two'.isidentifier()) # False # 由于标识符不能以数字开头,所以不合法
print('p p'.isidentifier()) # False # 含有空格,所以不合法
# 38. isascii
# str.isascii() - 判断str的字符是否都在 U+0000-U+007F 范围内,是则返回true,否则返回false。空串返回true
print('你'.isascii()) # False
print('1y'.isascii()) # True
print(''.isascii()) # True
# 39. isalpha
# str.isalpha - 判断str是否全部由字母组成。如果str至少有一个字符且所有字符都为字母则返回true,否则返回false。字母为广义字母,中文等语言都可以,
str1, str2, str3, str4 = 'sherlock', 's胡さしнпрστυ', '123', 'sher lock'
print(str1.isalpha()) # True
print(str2.isalpha()) # True
print(str3.isalpha()) # False
print(str4.isalpha()) # False # 由于存在空格,所以返回false
# 40. isalnum
# str.isalnum() - 如果 str 至少有一个字符并且所有字符都是字母(广义)或数字则返回 True,否则返回 False
str1, str2, str3 = '2weeks', '2个人', 'q_p 2]'
print(str1.isalnum()) # True
print(str2.isalnum()) # True
print(str3.isalnum()) # False
# 41. format_map
# str.format_map(mapping) - 与str.format类似,区别在于参数mapping只为字典对象
infro = {'name': '胡兴航', 'revenue': '50,000$'}
print('my name is {name}, my revenue is {revenue}.'.format_map(infro)) # my name is 胡兴航, my revenue is 50,000$.