码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-02-15 23:52:47      阅读:295      评论:0      收藏:0      [点我收藏+]

标签:bsp   slow   函数   检查   大小   检测   编号   语句   迭代   

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

(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 找出字符串中特定的字符

标签:bsp   slow   函数   检查   大小   检测   编号   语句   迭代   

原文地址:https://www.cnblogs.com/yorkyu/p/10386418.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!