• 单词记忆系统三:优化音标输入(允许键盘字符直接输入和音标序号混合输入)




    单词记忆系统三
    优化音标输入
    (允许键盘字符直接输入和音标序号混合输入)


    目 录


      在对我的“单词记忆系统”的“音标输入”持续“研究”中,发现大部分音标字符都是可以“键盘”直接输入的,直接输入比查找音标字符列表序号来得“方便快捷”。基于“优化”考量,我 want to 修改我的 Python 代码,使其能实行全序号或者全字符、亦或者键盘字符+序号混合输入。这看似不难的“需求”在我这个Python初级代码“书写者”手上,也算是比较硬的骨头。所幸在一天多零碎时光的修修改改、思考再思考加持下,终于还是实现了想要的“动作”。记录个学习笔记,以集攒以后的回忆“资料”。🤗


    回页首

    re提取音标序号、字符

      音标输入string(变量)中的序号提取倒是简单, r'\d*'或r'\d+' 一次搞定。序号以外字符的提取相对麻烦,我用r'\w[^0-9]+' 提取到了数字,居然。是记错不包含(排除)是用“^”?😞   查询re教程,re语法没错,那错的就是匹配表达式的编写了。多次阅读re教程,几经更迭,最后才得以写出正确re匹配表达式r'[^0-9^\s]'(不含任何空格和数字),匹配出了音标输入string中的数字空格以外的字符。

    re匹配代码

    re.findall(r'\d+', string) # 音标输入序号提取(int)。
    re.findall(r"[^0-9^\s]+", string) # 音标字符提取(数字外的字符)。
    
    • 1
    • 2

    回页首

    输入音标字符合法判定

    音标字符列表

    self.symbol = "ɑ: ʌ ɔ: ɒ ə ɜ: i: ɪ u: ʊ æ eɪ aɪ ɔɪ ɪə eə ʊə əʊ aʊ e θ ð ʃ ʒ ŋ tʃ dʒ \' p b t d k g f v s z tr dr ts dz m n h l r j w , ( )" # 在提取网络搜索的音标字符的基础上加入了“ ' ( ) ,”字符。
    
    • 1

      最初我还单独做了一个可以键盘直接输入字符的音标字符列表,仔细排查发觉,完全没必要,直接用整个字符表即可。几经试炼,最后选用集合与集合子集关系完成了“音标输入合法判定”。

    判定音标输入合法代码

    isnums = set(map(int, re.findall(r'\d+', string))) < set(range(len(self.symbol.split())))
    ischars = set(re.findall(r"[^0-9^\s]+", string)) < set(self.symbol.split())
    if isnums and ischars: break # 用re处理输入音标字符串的数字字符和非数字字符,分别判定其是否合法:在不在划定的合法范围。
    
    • 1
    • 2
    • 3

    回页首

    音标输入排错

      这次优化代码,还一并优化了音标输入排错。并调整了音标输入代码在整体代码中的位置,可以参照“单词记忆系统二”学习笔记源码比对。

    代码

    
            for i in (field_list := self.field.split()):
                field_main = field_list[:3]
                if i in field_main:
                    while True:
    
                        issymbol_show = False
                        if i == '音标':
                            if not issymbol_show: self.symbol_show()
                            issymbol_show = True
                            while True:
                                string = input(f"{'':>6}{i}:").strip()
                                #print(set(map(int, re.findall(r'\d+', string))), set(re.findall(r"[^0-9^\s]+", string))) # 调试语句,不删除,留个念想。
                                isnums = set(map(int, re.findall(r'\d+', string))) < set(range(len(self.symbol.split())))
                                ischars = set(re.findall(r"[^0-9^\s]+", string)) < set(self.symbol.split())
                                if isnums and ischars: break # 用re处理输入音标字符串的数字字符和非数字字符,分别判定其是否合法:在不在划定的合法范围。
                                if not isnums: print(color(' 输入序号超出范围!'.center(41,'~'), 91, 43))
                                if not ischars: print(color(' 输入音标字符错误!'.center(41,'~'), 91, 43))
                        else:
                            string = input(f"{'':>6}{i}:").strip()
    
                        if string: break 
                        print(color(f" “{i}”项不可以为空!".center(41,'~'), 91, 43))
                else:
                    string = input(f"{'':>6}{i}:").strip()
                    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    效果截屏图片
    在这里插入图片描述


    回页首

    ㊙️str.split()默认“秘密”

      str.split()方法,默认返回以空格分隔的字符列表,经试炼Python 3.10.2 版本下命令行模式,str.split()方法对空格的个数,没有要求:多个空格与单个空格,返回值一致,英文空格可以长短不一。
      注意:一定要是英文空格

    图一
    在这里插入图片描述

    图二
    在这里插入图片描述


    回页首

    优化后的完整代码跳过源码

    优化后的代码运行效果
    在这里插入图片描述

    #!/usr/bin/nve python
    # coding: utf-8
    
    '''
    filename = 'add_new_word.py'
    author = 'dream efl'
    time = '2022-08-16'
    '''
    
    import re
    from time import localtime
    
    from lib.mypycolor import Color
    color = Color().set_color # 设置色彩控制打印工具方法别名。
    
    
    def find_symbol(re_s, s):
        ''' 提取音标字符 '''
        symbol = re.findall(re_s, s) # re从字符串段落中提取音标字符。可能是我的re版本已经默认忽略\n,可以隔行搜索匹配,都不用加re.M参数了。😋
        return ' '.join(symbol)
    
    if __name__ == '__main__':
        s = '''2. 48个国际音标字符
    2.1. 20个元音
    /ɑ:/ /ʌ/ /ɔ:/ /ɒ/ /ə/ /ɜ:/ /i:/ /ɪ/ /u:/ /ʊ/ /e/ /æ/ /eɪ/ /aɪ/ /ɔɪ/ /ɪə/ /eə/ /ʊə/ /əʊ/ /aʊ/
    
    2.2. 28个辅音
    /p/ /b/ /t/ /d/ /k/ /g/ /f/ /v/ /s/ /z/ /θ/ /ð/ /ʃ/ /ʒ/ /tʃ/ /dʒ/ /tr/ /dr/ /ts/ /dz/ /m/ /n/ /ŋ/ /h/ /l/ /r/ /j/ /w/'''
        symbol = find_symbol(r"/(\w*[\:]*)/", s)
        print(f"\n从字符串段落中提取的{len(symbol.split()):>3} 个音标字符:\n{symbol}\n")
    
    
    class NewWordAdd:
        ''' 生词添加 '''
        
        def __init__(self):
            self.field = '单词 音标 释义一 释义二 释义三 释义四'
            self.demo = 'boy bɔɪ n.男孩;儿子;小伙子,家伙; interj.好家伙(表示激动、羡慕等情感);' # 单词信息示例。
            self.symbol = "ɑ: ʌ ɔ: ɒ ə ɜ: i: ɪ u: ʊ æ eɪ aɪ ɔɪ ɪə eə ʊə əʊ aʊ e θ ð ʃ ʒ ŋ tʃ dʒ \' p b t d k g f v s z tr dr ts dz m n h l r j w , ( )" # 在提取网络搜索的音标字符的基础上加入了“ ' ( ) ,”字符。
    
        def word_show(self, word):
            ''' 单词信息列印 '''
            for m,n in zip(self.field.split(), word):
                if not n: continue # 字段内容为'',跳过。
                if m == '音标': n = f"英/{n}/"
                print(f"{'':>6}{m}:{n}")
    
        def replace_symbol(self, symbol_list):
            ''' 从音标字符序号还原音标字符 '''
            new_symbol = [] # 转换序号后音标字符列表初值。
            symbol = self.symbol.split()
            for i in symbol_list:
                if i.isdigit(): # 数字,转换字符追加列表。
                    new_symbol.append(symbol[int(i)])
                else: # 字符,直接追加列表。
                    new_symbol.append(i)
            
            return ''.join(new_symbol)
    
        def symbol_show(self):
            ''' 打印音标字符列表 '''
            print(f"\n{color(' 音标表 '.center(47, '~'), 92)}\n{'':>10}", end='')
            for k,i in enumerate(self.symbol.split()):
                print(f"{k:>2}.{color(f'{i:>2}', 92)}", end=' ')
                if (k+1)%5 == 0: print(f"\n{'':>10}", end='') # 打印五个字符换行。
            print()
            
            print(color(' 请输入对应的数字(可直接输入的字符可以直接输入) '.center(28, '~'), 32))
            print(color('如:b 14 (bɔɪ)'.center(48), 100, 7, 30))
    
        def add_new(self):
            print(f"\n{color(' 生词输入示例 '.center(44, '~'), 92)}")
            self.word_show(self.demo.split())
            print(f"{color(' 无内容项直接确认 '.center(42, '-'), 32)}\n")
            new_word = []
            
            for i in (field_list := self.field.split()):
                field_main = field_list[:3]
                if i in field_main:
                    while True:
    
                        issymbol_show = False
                        if i == '音标':
                            if not issymbol_show: self.symbol_show()
                            issymbol_show = True
                            while True:
                                string = input(f"{'':>6}{i}:").strip()
                                #print(set(map(int, re.findall(r'\d+', string))), set(re.findall(r"[^0-9^\s]+", string))) # 调试语句,不删除,留个念想。
                                isnums = set(map(int, re.findall(r'\d+', string))) < set(range(len(self.symbol.split())))
                                ischars = set(re.findall(r"[^0-9^\s]+", string)) < set(self.symbol.split())
                                if isnums and ischars: break # 用re处理输入音标字符串的数字字符和非数字字符,分别判定其是否合法:在不在划定的合法范围。
                                if not isnums: print(color(' 输入序号超出范围!'.center(41,'~'), 91, 43))
                                if not ischars: print(color(' 输入音标字符错误!'.center(41,'~'), 91, 43))
                        else:
                            string = input(f"{'':>6}{i}:").strip()
    
                        if string: break 
                        print(color(f" “{i}”项不可以为空!".center(41,'~'), 91, 43))
                else:
                    string = input(f"{'':>6}{i}:").strip()
                if i == '音标': string = self.replace_symbol(string.split())
                new_word.append(string)
            
            print(color(' 输入新词 '.center(46, '~'), 92))
            self.word_show(new_word)
            print(color('-'*50, 32))
            new_word = ['-'.join(map(str, localtime()[:3]))]+ new_word
    
            try:
                with open('data/new_words.db', 'a') as f:
                    f.write(','.join(new_word) + '\n')
            except Exception as error:
                print(f"\n{color(' 新词保存异常!'.center(43, '~'), 91, 43)}\n")
                print(f"\n{color('ErrorType:', 32)} {color(error, 91, 43)}")
                return
    
            print(f"\n{color(' 新词成功保存。'.center(43, '~'), 92)}\n")
            input(color(' Enter anykey continue ... '.center(50, '~'), 30, 100, 7))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118

    回页首

  • 相关阅读:
    计算机毕业设计node+vue基于微信小程序的美甲店铺座位预约系统的设计与实现
    数据我爬定了,限流也挡不住,我说的
    [系统安全] 五十三.DataCon竞赛 (2)2022年DataCon涉网分析之恶意样本IOC自动化提取数据集详解
    光伏三相并网逆变器的控制策略与性能分析(Simulink仿真实现)
    【Transformer专题】Vision Transformer(ViT)原理 + 代码
    OnionArch - 如何实现更新指定字段的通用Handler
    微信小程序 - WXML 模板语法 - 条件渲染
    【C/C++】VS的cl命令 | 配置环境变量 | 使用命令行编译C/C++程序
    Java 全栈体系(二)
    Linux的wc
  • 原文地址:https://blog.csdn.net/m0_57158496/article/details/126373690