- 九、字符串
- 1. 字符串使用范围广、且极其方便
- 字符串的切片是是半闭半开区间,不包括最后的位置。
- 2. 字符串的各种方法
- 2.1 大小写转换
- 2.2 左中右对齐
- 2.3 查找
- 2.4 替换
- 2.5 判断
- 2.6 截取
- 2.7 拆分和拼接
- 3. format()语法格式化字符串
- 3.1 [align]
- 3.2 [sign]
- 4. 在python3中,默认使用UTF-8 Unicode来进行编码,Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
C语言和Python经常弄混,尤其总是忍不住给Python后面加分号……干脆给自己做个笔记省的忘了。。。(小甲鱼那边的)
- 在 Python初学小知识(一)中已经有部分关于字符串的讲解,本文是在那个基础上更进一步。
'''判断是否是回文数''' >>> x = '123454321' >>> '是回文数' if x == x[::-1] else '不是回文数' '是回文数'字符串的切片是是半闭半开区间,不包括最后的位置。 2. 字符串的各种方法 2.1 大小写转换
>>> x = 'I love FishC' >>> x.capitalize() #首字母大写,其余都小写 'I love fishc' #返回的并不是源字符串,字符串是不可变的,这只是新生成了一个字符串 >>> x.casefold() #全部小写 'i love fishc' >>> x.title() #所有单词的首字母大写,其余全部小写 'I Love Fishc' >>> x.swapcase() #大小写翻转 'i LOVE fISHc' >>> x.upper() #全部大写 'I LOVE FISHC' >>> x.lower() #全部小写 'i love fishc' '''casefold可以处理其他语言的小写,lower只能处理英文字母'''2.2 左中右对齐
首先都要指定宽度,如果width比源字符串总长度小,则按源字符串输出:
>>> x = '你好,世界!' >>> x.center(10) #居中 ' 你好,世界! ' >>> x.ljust(10) #左对齐 '你好,世界! ' >>> x.rjust(10) #右对齐 ' 你好,世界!' >>> x.zfill(10) #左填充0,用于指定长度时 '0000你好,世界!'
还可以对空白做补充:
>>> x = '你好,世界!' >>> x.center(10, '0') '00你好,世界!00' >>> x.ljust(10, '我') '你好,世界!我我我我'2.3 查找
>>> x = '上海自来水来自海上'
'''查找次数'''
>>> x.count('海')
2
>>> x.count('海', 0, 5) #查找片段中的次数
1
'''查找索引'''
>>> x.find('海') #从左往右找
1
>>> x.rfind('海') #从右往左找
7
>>> x.rfind('海',0,5) #从下标5的位置从右往左找
1
>>> x.rfind('海',4,9)
7
这个查找索引和index()的区别在于,当查找的内容不存在于字符串时,find()和rfind()返回-1,而index()报错
2.4 替换
把Tab全部替换成空格:
>>> code = '''
My name is Buranny.
Your name is Aamy.''' #上一行用Tab缩进,下一行用4个空格缩进
>>> new_code = code.expandtabs(4) #把Tab全部用4个空格表示
>>> new_code
'n My name is Buranny.n Your name is Aamy.'
>>> print(new_code)
My name is Buranny.
Your name is Aamy.
新字符串替换旧字符串,count表示替换次数,一般默认为-1,表示全部替换:
>>> '我爱我家'.replace('我', '你', -1) #此时也可以省略-1
'你爱你家'
>>> '我爱我家'.replace('我', '你', 1)
'你爱我家'
首先给出转换规则,再用translate进行转换:
>>> table = str.maketrans('ABCDEFG', '1234567')
>>> 'My Boy Lika Apple'.translate(table)
'My 2oy Lika 1pple'
>>> 'My Boy Lika Apple'.translate(str.maketrans('ABCDEFG', '1234567')) #结果相同
'My 2oy Lika 1pple'
>>> 'My Boy Lika Apple'.translate(str.maketrans('ABCDEFG', '1234567', 'Myle'))
' 2o Lika 1pp' #将指定的字符串中存在的元素忽略,所有的M、y、l、e全忽略了
2.5 判断
判断位置:
>>> x = '我爱python'
>>> x.startswith('爱') #判断字符串是否在起始位置
False
>>> x.startswith('我')
True
>>> x.startswith('爱', 1, 5)
True
>>> x.endswith('on') #判断字符串是否在末尾位置
True
>>> x.endswith('py',0 ,3)
False
>>> x.endswith('py',0 ,4)
True
>>> if x.startswith(('我', '你', '他')): #还可以利用元组判断
print('yes')
yes
判断大小写:
>>> x = 'I love Python' >>> x.istitle() #是否只有首字母大写,其余字母小写 False >>> x = 'I Love Python' >>> x.istitle() True >>> x = 'I AM SINGER' >>> x.isupper() #是否全是大写 True >>> x.upper().isupper() #先upper()全部转换成大写,然后isupper()是否全部大写 True >>> x = 'I AM SINGER' >>> x.islower() #是否全是小写 False
判断类型:
>>> x = 'I love Python' >>> x.isalpha() #是否全是字母 False #有空格 >>> ' n'.isspace() #单引号里面是缩进、空格、转义字符,判断是否是空白字符串 True >>> 'I love Python'.isprintable() #是否可打印 True >>> 'I love Pythonn'.isprintable() #转义字符不可打印 False
判断数字类型:
具体见isdigit()、isnumeric()和isdecimal()的区别。在isalpha()、isdigit()、isnumeric()和isdecimal()中,任意一个返回True,isalnum()都返回True。
判断是否是一个合法的python标识符(变量名必须是一个合法的python标识符):
>>> 'my god'.isidentifier() False >>> 'my_god'.isidentifier() True >>> 'my10'.isidentifier() True >>> '10my'.isidentifier() #标识符不能以数字开头 False
判断是否为python的保留标识符(if、for之类的):
>>> import keyword
>>> keyword.iskeyword('if')
True
>>> keyword.iskeyword('py')
False
2.6 截取
>>> ' 去除左侧的空白'.lstrip() '去除左侧的空白' >>> '去除右侧的空白 '.rstrip() '去除右侧的空白' >>> ' 去除两侧的空白 '.strip() '去除两侧的空白'
其中,chars=None表示什么都没有,就是去除空白的意思,可以在这里传入要去除的字符串:
>>> 'www.ilovefishc.com'.lstrip('wcom.')
'ilovefishc.com'
>>> 'www.ilovefishc.com'.rstrip('wcom.')
'www.ilovefish'
>>> 'www.ilovefishc.com'.strip('wcom.')
'ilovefish'
'''
在这里,以第一个举例,是对'www.ilovefishc.com'这个字符串从左到右按照字符进行查找,直到不在被删除字符串为止'wcom.':
首先,三个'w'都在'wcom.'中,删除;
接着,'.'在'wcom.'中,删除;
然后,'i'不在'wcom.'中,停止查找。
并不是整体删除'wcom.'的意思。
'''
整体删除字符串:
>>> 'www.ilovefishc.com'.removeprefix('www.') #删除指定前缀
'ilovefishc.com'
>>> 'www.ilovefishc.com'.removesuffix('.com') #删除指定后缀
'www.ilovefishc'
2.7 拆分和拼接
拆分:
>>> 'www.ilovefishc.com'.partition('.') #从左到右找分隔符,以'.'为标志拆分,仅拆分一次
('www', '.', 'ilovefishc.com')
>>> 'www.ilovefishc.com'.rpartition('.') #从右到左找分隔符,以'.'为标志拆分,仅拆分一次
('www.ilovefishc', '.', 'com')
>>> 'www.ilovefishc.com'.split('.') #从左到右找分隔符,以'.'为标志拆分,全部拆分
['www', 'ilovefishc', 'com']
>>> 'www.ilovefishc.com'.split('.',1)
['www', 'ilovefishc.com']
>>> 'www.ilovefishc.com'.rsplit('.',1) #从右到左找分隔符,以'.'为标志拆分,仅拆分一次
['www.ilovefishc', 'com']
>>> '你n我r他nr她'.splitlines() #以换行符进行拆分,默认为False,表示结果不包含换行符
['你', '我', '他', '', '她']
>>> '你n我r他nr她'.splitlines(True) #改为False,表示结果包含换行符
['你n', '我r', '他n', 'r', '她']
拼接:
>>> '.'.join(['www', 'ilovefishc', 'com']) #这里是把要拼接的子字符串以列表的方式包裹起来,用元组也可以
'www.ilovefishc.com'
#用加号也可以拼接,但是join更快:
>>> x = 'fishc'
>>> x += x
>>> x
'fishcfishc'
>>> ''.join(('fishc', 'fishc'))
'fishcfishc'
3. format()语法格式化字符串
>>> '1+2={}, 2^2={}, 3^3={}'.format(1+2, 2*2, 3*3*3)
'1+2=3, 2^2=4, 3^3=27'
#可以在花括号中写上数字表示是哪一个内容(位置索引):
>>> '{}看到{}就很激动'.format('我', '你')
'我看到你就很激动'
>>> '{1}看到{0}就很激动'.format('我', '你')
'你看到我就很激动'
#参数中的字符串被当作元组的元素来对待,所以下标是从0开始,花括号中是索引值
#同一个索引值可以被引用多次:
>>> '{0}{0}{1}{1}'.format('是', '非')
'是是非非'
#也可以使用关键字参数:
>>> '我叫{name},我爱{fav}。'.format(fav='Python', name='三耳01') #这时候元组中的顺序就不重要了
'我叫三耳01,我爱Python。'
#位置索引和关键字索引可以结合起来:
>>> '我叫{name},我爱{0},{0}很好玩。'.format('Python', name='三耳01')
'我叫三耳01,我爱Python,Python很好玩。'
#输入花括号
>>> '{}, {}, {}'.format(1, '{}', 2) #把花括号看成字符串
'1, {}, 2'
>>> '{}, {{}}, {}'.format(1, 2) #用花括号注释花括号,元组中就只是剩下的了
'1, {}, 2'
更多用法:
[[fill]align][sign][#][0][width][grouping_option][.precision][type]
>>> '{:^10}'.format('apple') #宽度为10,^表示居中
' apple '
>>> '{1:<6}{0:>6}'.format('boy', 'cat') #宽度为6,1表示索引为1,即'cat',<表示居左,>表示居右
'cat boy'
#位置索引改成关键字索引也一样
>>> '{c:<6}{b:>6}'.format(b='boy', c='cat')
'cat boy'
#感知正负号填充0(只对数字有效):
>>> '{:09}'.format(55) #宽度为9
'000000055'
>>> '{:09}'.format(-55)
'-00000055'
#可以指定填充的字符(此时不是感知正负号填充0,就需要表示位置了):
>>> '{:%^9}'.format(55)
'%%%55%%%%'
>>> '{:%>9}'.format(-55)
'%%%%%%-55' #这里没有感知正负号,而如果想感知正负号,则换成等于号:
>>> '{:%=9}'.format(-55)
'-%%%%%%55' #同理,前面填充0的时候也可以是:
>>> '{:0=9}'.format(-55)
'-00000055'
3.2 [sign]
>>> '{:+} {:+}'.format(1, -1)
'+1 -1'
>>> '{:-} {:-}'.format(1, -1)
'1 -1'
>>> '{: } {: }'.format(1, -1)
' 1 -1'
设置千分位的分隔符:
>>> '{:,}'.format(1234567)
'1,234,567'
>>> '{:_}'.format(1234567)
'1_234_567'
精度(不允许用在整数上):
>>> '{:.2f}'.format(3.1415) #限定小数点后多少位
'3.14'
>>> '{:.2g}'.format(3.1415) #限定小数点前后多少位
'3.1'
>>> '{:.6}'.format('I love Python') #限定非数字类型最大字段的大小
'I love'
类型type:
整数:
>>> '{:b}'.format(80)
'1010000'
>>> '{:c}'.format(80)
'P'
>>> '{:d}'.format(80)
'80'
>>> '{:o}'.format(80)
'120'
>>> '{:x}'.format(80)
'50'
>>> '{:#b}'.format(80) #加上一个#号,会在结果中加入前缀
'0b1010000' #加上了一个0b表示是二进制
小数:
>>> '{:e}'.format(30)
'3.000000e+01' #这里的科学计数法的小数是6位
>>> '{:f}'.format(3.1415)
'3.141500' #小数6位
>>> '{:g}'.format(123456789) #g通用,大数
'1.23457e+08'
>>> '{:g}'.format(1234.56789) #g通用,小数
'1234.57'
>>> '{:%}'.format(0.98)
'98.000000%'
>>> '{:.2%}'.format(0.98) #更改精度
'98.00%'
>>> '{:.{prec}%}'.format(3.1415, prec=2) #用关键字更改精度
'314.15%'
>>> '{:{fill}{align}{width}.{prec}{ty}}'.format(3.1415, fill='+', align='^', width=10, prec=3, ty='g')
'+++3.14+++'
>>> '{:.4g}'.format(3.1415) #四舍五入
'3.142'
>>> '{:.3%}'.format(3.1415) #%和g表示的精度不一样,g是限定小数点前后多少位,前面已经说了
'314.150%'
f/F-字符串:可以看作是format()的一个语法糖,进一步简化操作,并且带来了功能上的提升(python3.6的产物,format()兼容性更高,所以更广泛):
>>> '1+2={}, 2^2={}, 3^3={}'.format(1+2, 2*2, 3*3*3)
'1+2=3, 2^2=4, 3^3=27' #就可以变成:
>>> f'1+2={1+2}, 2^2={2*2}, 3^3={3*3*3}' #不需要format()了
'1+2=3, 2^2=4, 3^3=27'
#格式化字符串同理
>>> '{:010}'.format(-55)
'-000000055'
>>> f'{-55:010}'
'-000000055'
>>> '{:,}'.format(1234567)
'1,234,567'
>>> F'{1234567:,}'
'1,234,567'
4. 在python3中,默认使用UTF-8 Unicode来进行编码,Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。


