Python:精英黑客对讲机--正则表达式多值替换不同值-字符串内容替换

   前两天python老师布置了一个字符替换类型的题,我想着用replace方法的效率未免有点太低了,于是便想着用强大的正则表达式来完成这一作业。

先看看题('_'):

精英黑客对讲机:

   编写一个函数,将黑客精英发送的信息转换为暗语输出,如发送的信息中含有数字0,就把数字0替换为暗语字母O。含有数字2,就把数字2替换为暗语字母z. (如下图)

 

 开始答题 ^_^ : 

如果对正则表达式还不是很熟悉,那就再了解一下:

官方文档: re --- 正则表达式操作 — Python 3.10.3 文档icon-default.png?t=M276https://docs.python.org/zh-cn/3/library/re.html#re.sub

推荐一下,猪哥和全洛两位大佬总结的也都非常好👍 

Python正则表达式,这一篇就够了!_猪哥-CSDN博客

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:

 

现在这个黑客精英对讲机问题是不是就清晰了很多呢😊。正则表达式的用法还有很多,让我们一起学习并掌握他吧。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值