[Python3 练习] 010 找出字符串中特定的字符

Posted YorkFish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python3 练习] 010 找出字符串中特定的字符相关的知识,希望对你有一定的参考价值。

题目:找出藏在字符串中的“密码”

(1) 描述

1) 题源1

2) 题源2

  • 这几日挺巧的
    • 在鱼 C 论坛上找 Python 习题,点开第 20 节,看到两道操作题
    • 又想起一个网站 Python Challenge ,久闻其名,未曾拜访,遂一探究竟
    • 原来小甲鱼老师第 20 节的两道操作题改编自 Python Challenge 的 level2 与 level 3

2) 修改

  • 题中仍带有一条极长的字符串,不方便写在此随笔中
  • 我自己又心血来潮,将此题改了改(其实降低难度)
  • 具体见下方要求

(2) 要求

  • 有一字符串,仅含大小写英文字母(回车、空格等均不在其列)
  • 若 1 个小写字母左右两边均有且仅有 3 个大写字母,则将其挑出
  • 将所有挑出的小写字母按顺序输出
  • 例如
    • AAAAjBBBpCCCrDDmEEEyFFFqqGGG
    • 输出 py

(3) 程序

  • 解法 1:一一检测(像是暴力破解)
def decrypt(string):
    len_str = len(string)
    target = 4
    
    if     # 检测 3 号位
    string[0].isupper() and     string[1].isupper() and     string[2].isupper() and     string[3].islower() and     string[4].isupper() and     string[5].isupper() and     string[6].isupper() and     string[7].islower():
        print(string[3], end=‘‘)
    
    while target < len_str-4:
        if # 检测中间各位
        string[target-4].islower() and     # 若有多种字符,可用 not string[i].isupper()
        string[target-3].isupper() and         string[target-2].isupper() and         string[target-1].isupper() and         string[target  ].islower() and         string[target+1].isupper() and         string[target+2].isupper() and         string[target+3].isupper() and         string[target+4].islower():
            print(string[target], end=‘‘)
            target += 4
        else:
            target += 1
       
    if     # 检测倒数第 4 位
    string[len_str-7].islower() and     string[len_str-6].isupper() and     string[len_str-5].isupper() and     string[len_str-4].islower() and     string[len_str-3].islower() and     string[len_str-2].isupper() and     string[len_str-1].isupper() and     string[len_str  ].isupper():
        print(string[len_str-3], end=‘‘)


  • 解法 2:利用编号

因为字符串中只有大小写英文字母,所以先找出所有小写英文字母的编号,再检查编号的间距。

若左右相邻的编号大小均相差 4,则该编号对应的字母即为所求之一。

(若有回车符,可用 if 语句将非回车符依次写入列表中,再用以下程序。)

def decrypt(string):
    len_str = len(string)
    list0 = []
    for i in range(len_str):            # 找出所有小写字母在 string 中的编号,并写入 list0
        if string[i].islower():
            list0.append(i)
    
    len_list0 = len(list0)
    list1 = []
    if list0[0] == 3 and list0[1] == 7: # 检测 3 号位
        list1.append(3)
    for i in range(1, len_list0-1):     # 找出 list0 中符合要求的小写字母的编号
        if (list0[i]-4) == list0[i-1] and (list0[i]+4) == list0[i+1]:
            list1.append(list0[i])
    if list0[-1] == len_str-4 and     list0[-2] == len_str-8:             # 检测倒数第 4 位
        list1.append(list0[-1])

    len_list1 = len(list1)
    for i in range(len_list1):          # 输出
        print(string[list1[i]], end=‘‘)


  • 解法 3:利用 3 个变量,统计大小写字母的个数(详见下方 countA、countB、countC)
def decrypt(string):    
    countA = 0  # 统计小写字母左侧的大写字母
    countB = 0  # 统计小写字母
    countC = 0  # 统计小写字母右侧的大写字母

    len_str = len(string)
    for i in range(len_str):
        if string[i].isupper():
            if countB:              # AAAaA AAAaAA AAAaAAA
                countC += 1
            else:                   # A AA AAA AAAA ...
                countC = 0
                countA += 1

        if string[i].islower():
            if countA != 3:         # a Aa AAa AAAAa ... 
                countA = 0
                countB = 0
                countC = 0
            else:
                if countB:          # AAAaa
                    countA = 0
                    countB = 0
                    countC = 0
                else:               # AAAa
                    countB = 1
                    countC = 0
                    target = i

        if countC == 3:
            if i+1 != len_str and  # 若 i 未迭代到最后一位
            string[i+1].isupper():  # AAAaAAAA
                countB = 0
                countC = 0
            else:                   # AAAaAAAb 总算找到了一个 a
                print(string[target], end=‘‘)
                countA = 3          # AAAb
                countB = 0
                countC = 0


以上是关于[Python3 练习] 010 找出字符串中特定的字符的主要内容,如果未能解决你的问题,请参考以下文章

Python3 练习2 列表和字典练习

python小练习-找出字符串中的子字符串

python010 Python3 元组

python3练习100题——022

练习010:按奇偶排序数组

Python练习题 038:Project Euler 010:两百万以内所有素数之和