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

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

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

1 阅读:39

时启发

简介:读书笔记,编程经验,旅途见闻,人生感悟