前两天python老师布置了一个字符替换类型的题,我想着用replace方法的效率未免有点太低了,于是便想着用强大的正则表达式来完成这一作业。
先看看题('_'):
精英黑客对讲机:
编写一个函数,将黑客精英发送的信息转换为暗语输出,如发送的信息中含有数字0,就把数字0替换为暗语字母O。含有数字2,就把数字2替换为暗语字母z. (如下图)
开始答题 ^_^ :
如果对正则表达式还不是很熟悉,那就再了解一下:
官方文档: re --- 正则表达式操作 — Python 3.10.3 文档https://docs.python.org/zh-cn/3/library/re.html#re.sub
推荐一下,猪哥和全洛两位大佬总结的也都非常好👍
Python正则表达式详解 (超详细,看完必会!)_全 洛的博客-CSDN博客_python正则表达式详解
首先,我们需要知道re库中具有替换功能的函数有:sub函数和subn函数。
这里我用的是sub函数:re.sub(pattern, repl, string, count=0, flags=0)
###举例
import re
Str = "sinx+e**x*cosx/lnx"
print(re.sub(r'sin', 'np.sin', Str))
#结果
#np.sinx+e**x*cosx/lnx
注:subn返回的是一个 元组(替换后的字符串,替换次数)。
OK,上代码(+——+):
import re
def StrProcess(CS): #CS:CharacterSet(字符集)
Targ=['1','2','3','4','5','6','7','8','9'] #Targ:TargetChars(目标字符)
Repl=['I','Z','E','Y','S','G','L','B','P'] #Repl:ReplaceChars(替换字符)
Capt=lambda x: Repl[Targ.index(x.group(0))] #Capt:CapterString(捕获字符串)
STR = re.sub("|".join(Targ),Capt,CS)
return STR
print(StrProcess(input("输入")))
短短的几行,但让人安心😜
分析:
起初我查了一些资料,本以为sub函数会有pattern与repl一一对应替换式的“多对多”的方法,可惜没有😢。不过虽然sub函数为我们关上了一扇门,但他却打开了另一扇大门:repl替换内容既可以是字符串也可以是函数。
什么!函数!那岂不是只要不是太过分我就可以为所欲为了😆。
于是:
我们将目标字符串与替换字符串按题目逻辑进行排序,并借助lambda表达式来个简单的按下标取值,不就可以达到我们想要的一一对应了。(只要两个字符串按逻辑对应好,其内部元素是什么对想要的结果无影响)
解析:
理解group:
<1>Capt=lambda x: Repl[Targ.index(x.group(0))]
举例说明:x.group()获得一个匹配的字符"3"后,由Targ.index(x.group(0))得整数2 (“3”在Targ列表的下标),进而Repl[Targ.index(x.group(0))]便会返回"E"。(获得坐标也可用find,但index在找不到子字符串时会引发 ValueError)
此函数功能便是通过不同的匹配值选择不同的替换值进行替换。
<2>STR = re.sub("|".join(Targ),Capt,CS)
"|".join(Targ)=>"1|2|3|4|5|6|7|8|9",表示匹配规则:'1|2|3|4|5|6|7|8|9'。
eg:
现在这个黑客精英对讲机问题是不是就清晰了很多呢😊。正则表达式的用法还有很多,让我们一起学习并掌握他吧。