极简python 之 利用正则表达式pattern串实现昵称到实名的转换

时启发2024-05-27 18:44:35  52

在真实的世界里,我们称为第三者时,除了单数的他、她、它和复数的他们、她们和它们外,往往采用昵称或假名的形式。比如在一个小群体内,重复的姓氏不多的时候,会根据年龄大小分为大中小+姓的称呼方式(第二人称也经常用,特别是在确认你打算跟哪位具体人物聊天时),比如小王、小赵、大刘、老张。现在,我们想把这些指代的(或者说约定俗成的,在某个环境中公认或大部分人认同的)名称,在程序中还原为具体的指代对象。这件事就可以通过python的正则表达式来实现。

首先,我们创建了一个json文件存储的数据(加载后成为python的dict对象),如下图:

图1 昵称对照字典

上图仅为范例,加载后字典对象的关键字,可以视为规范的指代称谓,且在一定范围内具有唯一性(比如可以作为关系型数据库某个表中的关键字列,所以可看做数据表id列的值)。在键值对的值的那一部分,我们采用了列表来存储可以匹配的pattern串,或者说这个列表是大家可以接受的称谓的组合(细品,这些称谓,有时就是一个人的某种代表性特质或特征),或者还可以说这些pattern串的匹配就是某种分类函数。

现在需要把这个字典对象组合成pattern串,关键字作为正则表达式匹配对象的group名。见图2

图2 根据预定义的昵称对照表,判断输入内容是否存在特定指代对象

图3 执行结果

运行时我们输入了“小猴哥哥救援宫家庄亏电车辆”,然后给出了根据alias.json配置拼接的pattern串。最后利用正则表达式,找出输入内容中是否存在对应的人。从执行结果可以看到,除了猴哥匹配到了“小猴哥哥”,其他人匹配的结果为None。不过,人是社会的人,所以,猴哥可能会和其他人一起参见救援。现在我们输入“内丘手拉手、猴哥、阿龙救援宫家庄亏电车辆”,见图4。

图4 多人参与救援的执行结果(错)

很遗憾,执行结果并没有如我们期待那般返回三个人的匹配结果,这是因为,在找到其中一个匹配之后,我们的搜索便结束了。我们的第一次尝试是在各个部分前面加上可选的顿号“、”。见图5、图6:

图5 pattern串添加可选顿号的尝试

图6 结果并没有什么不同

再次遗憾,结果并没有什么不同。这是因为我们匹配的字符串只是“内丘手拉手”,而不是“内丘手拉手、猴哥、阿龙”这个主语部分。所以,需要匹配一次以上的人(中间用顿号分隔)。见图7,图8

图7 调整为一次以上的匹配

图8 最新的结果字典对象(OK)

如我们所需要的那样,匹配字符串为“内丘手拉手、猴哥、阿龙”。最关键的是结果字典对象,内丘手拉手救援队、阿龍、猴哥这些人的关键字对应的值(也可以说不规范的输入值)不为None。尽管还不能根据已知推理未知,但主语未知不等于谓语部分未知,如果谓语已知,则主语部分就存在推理出新参与人的可能。

图9 最新的代码

转载此文是出于传递更多信息目的。若来源标注错误或侵犯了您的合法权益,请与本站联系,我们将及时更正、删除、谢谢。
https://www.414w.com/read/597039.html
0
随机主题
汪峰女友森林北旧照,牙齿参差不齐黑眼圈严重,与普通人没差别福特EVOS命名为蒙迪欧运动版, 官图发布, 搭载2.0T混动系统美媒最新模拟选秀: 里萨谢成状元, 萨尔掉至第2, 火箭队摘中锋董华出任中超公司总经理6.18电视超详细选购指南 快来抄作业!特高压多条储备项目披露, 电网行业景气度有望持续!合砍63分逆转! 欧文再现超强得分能力, 东契奇关键中投赢球独行侠西决开门红!东欧组合轰下63分,唐斯低迷,爱德华兹准三双米兰与斯图加特酝酿交易, 卡卢卢西米奇成筹码, 交换28岁德甲银靴朱一珺新搭档孙文骏 孙文骏(石宇奇教练孙俊之子)日媒: 初创企业成乌军用无人机开发主力“取卵术”、胚胎培养……陕西新增16项辅助生殖类医疗价格项目DNF: 新副本传奇页游风, 记录室钥匙千万留好! 每周7次奖励拉满1962年投资1000万美元,真实装备与军人协助拍摄,被封为二战电影封神之作!聪明贼留下挑衅信被警察抓, 成功打脸如何让爱车实现 无线carplay功能?卷价格, 卷新老车主权益, 纯电SUV铂智4X起步价14.98万元戏中戏负责看点, 真戏负责惊悚悬疑, 一片多吃打脸! 爱德华兹赛前放豪言, 欧文30分关键罚球, NBA各界嘲讽上海海港豪华攻击潜藏7+1小于7隐患, 徐正源敢让甘超1换1奥斯卡?Steam账号无法通过遗产继承, 赛博遗产计划破灭
最新回复(0)