第五章:python字符串的方法


编码:UTF-8


  • ASCII码:一个字符1B
  • GB2312、GBK、CP939:1个中文字符2B
  • python3默认使用UTF-8:UTF-8:英语字符1B;常见汉字字符3B

格式化字符串

在这里插入图片描述

1、format方法

  • 序号0,1,2…指定格式化哪个元素
  • 对齐:默认右对齐
  • 10.3f:该数据一共占10个字符位置,保留3位小数
  • 20s:字符串一共占20个字符
  • 10.3%:数据一共占10个字符,百分数保留2位小数
  • 06b:二进制数字一共占6位,高位补0

单个输出:

format(数据,'格式')

>>> format(532.26, '10.3f')
'   532.260'
>>> format('你好呀笨蛋', '>20s')
'               你好呀笨蛋'
>>> format(0.001234, '10.3%')
'    0.123%'

二进制数字高位补零输出

>>> format(2, '06b')
'000010'

多个输出:

'{0: 格式}, {1: 格式},....'.format(数据, 数据2,....)

>>> '输出小数:{0: >10.3f}\n输出字符串:{1: <20s}\n输出百分数{2: >10.3%}'.format(532.26, '你好呀笨蛋', 0.0011234)
'输出小数:   532.260\n输出字符串:你好呀笨蛋               \n输出百分数    0.112%'

2、center,rjust,ljust对齐填充

new_string = string.center(长度, 填充单字符)
>>> # 字符串对齐并补全
>>> 'hello cc'.center(20, '*')
'******hello cc******'
>>> 'hello cc'.rjust(20, '*')
'************hello cc'
>>> 'hello cc'.ljust(20, '*')
'hello cc************'

填充字符你只能写单字符
在这里插入图片描述

>>> 'ccc'.center(20, '=')
'========ccc========='

子母串


1、[r]find,[r] index:子串首次出现下标


查找一个字符串在另一个字符串指定范围(默认是整个字符串)中首次或最后一次出现的位置:

  • 如果不存在则返回-1:find, rfind
  • 如果不存在抛出异常:index, rindex

string.find(substring[, start[, end]]) -> int


返回文本中每个字符的首次出现:

>>> text = '''
东边来个小朋友叫小松,手里拿着一捆葱。
西边来个小朋友叫小丛,手里拿着小闹钟。
小松手里葱捆得松,掉在地上一些葱。
小丛忙放闹钟去拾葱,帮助小松捆紧葱.
小松夸小丛像雷锋,小丛说小松爱劳动。
'''
>>> for i, ch in enumerate(text):
	if i == text.find(ch): # 当前ch是首次出现的ch,才记录
		print('字符{0}首次出现下标为{1}'.format(ch, i))

2、count:返回子串出现次数

查找一个字符串在另一个字符串中出现的次数:string.count(substring)


3、startswith, endswith:是否以子串开头/结尾

S.endswith(suffix[, start[, end]]) -> bool

>>> import os
# 文稿下文件
>>> [filename for filename in os.listdir()]
['.DS_Store', 'Nuts', '.localized', '二阶段锁.xlsx', 'GTA Vice City User Files', 'totalLength.plist', 'Python3萌新入门笔记.pdf', 'TencentMeeting', '.UTSystemConfig', '1400115281_report_pb.dump', 'src']
# 找到以pdf结尾的文件
>>> [filename for filename in os.listdir() if filename.endswith('.pdf')]
['Python3萌新入门笔记.pdf']

分割


1、[r]split


  1. string.split(分隔符默认为所有空白符, maxsplit = n)
  2. re.split:分割符可以多个
  3. 使用正则对象:分割符可以多个

1.1、不用正则


  • 不指定分隔符,则字符串中的任何空白符号(空格、换行符、制表符等)都将被认为是分隔符,并删除切分结果中的空字符串
>>> string = '  apple,peach,  peach,pear,orange'
>>> string.split()
['apple,peach,', 'peach,pear,orange']
  • 指定分隔符会保留空白字符串
>>> string = '  apple,peach,  peach,pear,orange'
>>> string.split(',')
['  apple', 'peach', '  peach', 'pear', 'orange']
>>> string.split('peach')
['  apple,', ',  ', ',pear,orange']
  • 指定最大分割次数
>>> string = '  apple,peach,  peach,pear,orange'
>>> string.split(maxsplit = 2)
['apple,peach,', 'peach,pear,orange']

1.2、用正则


直接re

>>> text = 'alpha. beta....gamma delta'
>>> re.split(r'[. ]+', text)
['alpha', 'beta', 'gamma', 'delta']

用正则对象

>>> text = 'alpha. beta....gamma delta'
>>> pattern = re.compile(r'[. ]+')
>>> pattern.split(text, maxsplit = 2)
['alpha', 'beta', 'gamma delta']

2、[r]partition一分为三

永远结果是三份:左中右 string.[r]partition(中间字符串)

>>> string = '  apple,peach,  peach,pear,orange'
>>> string.partition('peach')
('  apple,', 'peach', ',  peach,pear,orange')

连接字符串join

string = '连接符'.join(字符串列表)

>>> '::'.join(['aa', 'bb', 'cc'])
'aa::bb::cc'
>>> '::'.join(['aa'] * 5)
'aa::aa::aa::aa::aa'
>>> ''.join(['aa', 'bb', 'cc'])
'aabbcc'

大小写、是否是数字、字母…


1、转换大小写,首字母…

  • titile:对每个单词首字母大写,其余字母转化为小写,单词里的其他字符保持不变
    在这里插入图片描述

2、字符串是否由xx组成

  1. isalnum()字母和数字组成
  2. isalpha()全是字母
  3. isdigit()全是正整数
  4. isnumerical():支持汉字数字,罗马数字
>>> '一'.isnumeric()
True
>>> 'ⅣⅢⅩ'.isnumeric()
True
  1. isdecimal():十进制
  2. isspace():是空白字符
  3. isupper():全是大写
  4. islower()全是小写

替换、映射:replace,maketrans


1、replace:指定子串不重叠全部替换

new_string = string.replace('word', 'replacestring', 替换次数)

如下替换cc和dad都是不重叠的
>>> 'cccdadad'.replace('cc', '*')
'*cdadad'
>>> 'cccdadad'.replace('dad', '*')
'ccc*ad'

应用1:判断s2在s1中不重叠出现的次数。

    '''1. 遍历'''
    res, i = 0, 0
    while i < len(s1) - len(s2) + 1:
        if s1[i:i + len(s2)] == s2:
            res += 1
            i += len(s2)
        else:
            i += 1
    return res

    ''' 2. split分割'''
    return len(s1.split(s2)) - 1

    '''3. replace替换的特性:不重叠替换,个人觉得最好理解'''
    s = s1.replace(s2, '*')
    return s.count('*')

应用2:关键词屏蔽

>>> words = ['asshole', 'stupid', 'kill']
>>> for word in words:
	if word in 'i will kill you':
		'i will kill you'.replace(word, '*****')

		
'i will ***** you'

2、maketrans/translate:多字符一一映射


1、映射表:table = ''.maketrans(string1, string2)
2、开始映射:new_string = string.translate(table)

>>> table = ''.maketrans('12345', '一二三四五')
>>> string = '42352346'
>>> new_string = string.translate(table)
>>> new_string
'四二三五二三四6'
>>> table
{
    
    49: 19968, 50: 20108, 51: 19977, 52: 22235, 53: 20116}

凯撒加密解密

from string import ascii_letters, ascii_lowercase, ascii_uppercase
def kaisaEncrypt(string, k):
    # 每个字母替换为后面k个
    new_lower = ascii_lowercase[k:] + ascii_lowercase[:k]
    new_upper = ascii_uppercase[k:] + ascii_uppercase[:k]
    table = ''.maketrans(ascii_letters, new_lower + new_upper)
    new_string = string.translate(table)
    return new_string

# 是否解密成功
def check(temp_string) -> bool:
    # 不唯一:我们对每次尝试解密的结果测试是否含有至少两个常见单词,若有,则认为解密成功
    mostCommonWords = ('the', 'is', 'to', 'not', 'have', 'than', 'for', 'like')
    # 如果word在temp_string中,则元祖放一个1
    return sum(1 for word in mostCommonWords if word in temp_string) >= 2


def kaisaDecrypt(new_string):
    # 加密是后移字母,一共有26种情况,一一测试
    for i in range(1, 26):
        temp_string = kaisaEncrypt(new_string, -i)
        if check(temp_string)== True:
            return temp_string

if __name__ == '__main__':
    string = "Python is a greate programming language. I like it!"
    new_string = kaisaEncrypt(string, 3)
    print(kaisaDecrypt(new_string))

从外向里删除指定若干字符:[r]strip


  • 一般用于提取每行文本取出空格
  • new_string = string.strip(字符/字符串)

规则:看外侧有啥,再看参数有没有该字符,有则删除,没有则删不掉


无参数:相当于参数为空白字符

  • 外侧有空白字符,参数也是空白字符,删除成功,剩下hello world,外侧为h、w,参数没有。剩下hello world
>>> '  hello world  '.strip()
'hello world'

单个字符参数

  • 外侧有d、f,参数没有,删除失败
>>> 'dffdfaaafff'.strip('a')
'dffdfaaafff'
  • 外侧有a,参数有a,删除成功
>>> 'afffaffaa'.strip('a')
'fffaff'

字符串参数

  • 先看外侧有a和c,参数 含有a,即只需要含有,不看顺序 ,则删除,得到:ddfffccc;
  • 然后外侧有d和c,参数没有,仍然是ddfffccc
>>> 'aaaddfffccc'.strip('af')
'ddfffccc'
  • 例:结果是全部删掉了
>>> 'aabbccddeeeffg'.strip('gbaefcd')
''

rstrip, lstrip:只看右/左外侧

  • 左边外侧有a,参数有a。
>>> 'aadfaaffffaaddaa'.lstrip('a')
'dfaaffffaaddaa'
>>> 'aadfaaffffaaddaa'.rstrip('a')
'aadfaaffffaadd'

文本规范化输出

规范化每行输出:姓名:张三…

>>> text = '''姓名:张三
		年龄:39
		性别男
		职业  学生
		籍贯:  地球'''
>>> lst_lines = [line.strip() for line in text.split('\n')]
>>> lst_lines
['姓名:张三', '年龄:39', '性别男', '职业  学生', '籍贯:  地球']

>>> for item in lst_lines:
	print(item[:2], item[2:].strip(': '), sep = ':')

	
姓名:张三
年龄:39
性别:男
职业:学生
籍贯:地球


eval(string)的两大功能

参数必须是字符串!


1、计算字符串表达式的值:eval(string)


tip: 经leetcode解题过程发现:
eval链接字符串运算比直接int(string)再做运算,或者ord(‘string’)-ord(‘0’)慢的多

在这里插入图片描述


2、得到字符串内元素的原本格式


判断eval内的string是否是合法输入


  • 元祖的特殊形式
>>> 1,2,3
(1, 2, 3)
>>> 1,2,
(1, 2)

  • 字符串元祖—>元祖
>>> eval('1,2,')
(1, 2)
>>> eval('1 2')
Traceback (most recent call last):
  File "<pyshell#98>", line 1, in <module>
    eval('1 2')
  File "<string>", line 1
    1 2
      ^
SyntaxError: unexpected EOF while parsing
  • 易错点:'string’传入的string只是一个变量,“‘string’”
>>> eval('string')
Traceback (most recent call last):
  File "<pyshell#96>", line 1, in <module>
    eval('string')
  File "<string>", line 1, in <module>
NameError: name 'string' is not defined

>>> eval("'string'")
'string'

转义符号:\,r


一般\n, \t算一个字符,如果加上转义符号r或者 \则变成单纯两个字符:\ 和n

>>> len(r'\ngood')
6
>>> len('\\ngood')
6
>>> len('\ngood')
5

字符串s=‘a\nb\tc’,则len(s)的值是( )。C
A.7 B.6 C.5 D.4

Python语句print(r"\nGood")的运行结果是( \nGood )。


猜你喜欢

转载自blog.csdn.net/weixin_42810939/article/details/123465800