Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚

在对我的“单词记忆系统”的“音标输入”持续“研究”中,发现大部分音标字符都是可以“键盘”直接输入的,直接输入比查找音标字符列表序号来得“方便快捷”。基于“优化”考量,我 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博:
- Hot:回车符、换行符和回车换行符(1002阅读)
- Hot:Linux 脚本文件第一行的特殊注释符(井号和感叹号组合)的含义(1017阅读)
- pandas 数据类型之 Series(1099阅读)
- 聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )(1226阅读)
- 练习:银行复利计算(用 for 循环解一道初中小题)(1111阅读)
- pandas 数据类型之 DataFrame(1765阅读)
- Hot:班里有人和我同生日难吗?(蒙特卡洛随机模拟法)(2125阅读)
- Python字符串居中显示(1792阅读)
- 练习:求偶数和、阈值分割和求差( list 对象的两个基础小题)(1660阅读)
- 用 pandas 解一道小题(1988阅读)
- 可迭代对象和四个函数(1078阅读)
- “快乐数”判断(1245阅读)
- 罗马数字转换器(构造元素取模)(1984阅读)
- Hot:罗马数字(转换器|罗生成器)(4302阅读)
- Hot:让QQ群昵称色变的代码(33047阅读)
- Hot:斐波那契数列(递归| for )(4060阅读)
- 柱状图中最大矩形(1661阅读)
- 排序数组元素的重复起止(1253阅读)
- 电话拨号键盘字母组合(1380阅读)
- 密码强度检测器(1889阅读)
- 求列表平衡点(1827阅读)
- Hot: 字符串统计(4299阅读)
- Hot:尼姆游戏(聪明版首发)(3459阅读)尼姆游戏(优化版)(1074阅读)
推荐条件
点阅破千

精品文章:
- 好文力荐:《python 完全自学教程》齐伟书稿免费连载
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
Python 入门指南【Python 3.6.3】
好文力荐:
-
全栈领域优质创作者——寒佬(还是国内某高校学生)好文:《非技术文—关于英语和如何正确的提问》,“英语”和“会提问”是学习的两大利器。