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

156 篇文章 3 订阅

Python 官网https://www.python.org/




  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……


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


目 录


  在对我的“单词记忆系统”的“音标输入”持续“研究”中,发现大部分音标字符都是可以“键盘”直接输入的,直接输入比查找音标字符列表序号来得“方便快捷”。基于“优化”考量,我 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) # 音标字符提取(数字外的字符)。

回页首

输入音标字符合法判定

音标字符列表

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 , ( )" # 在提取网络搜索的音标字符的基础上加入了“ ' ( ) ,”字符。

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

判定音标输入合法代码

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处理输入音标字符串的数字字符和非数字字符,分别判定其是否合法:在不在划定的合法范围。

回页首

音标输入排错

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

代码


        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()
                

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


回页首

㊙️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))

回首页

__上一篇:__ 十六进制字符串转Python代码(utf-8字符串转十六进制字符串)

__下一篇:__ 彩色文字界面“尼姆游戏”(Python类+mypycolor工具协同打造)

我的HOT博:
推荐条件 点阅破千

回目录


老齐漫画头像

精品文章:

来源:老齐教室


回目录

Python 入门指南【Python 3.6.3】

好文力荐:

CSDN实用技巧博文:


  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值