我正在尝试使用Python 3处理SNMP sysDescr.0输出中的文本,我需要使用包含模式及其替换的字典,如下所示:
myDict = {
r' \(\/sw.+': '',
r' \(\/ws.+$': '',
r'Compiled on.{36}': '',
r'Ruckus Wireless, Inc. ': '',
r'Brocade Communications Systems, Inc. ': '',
r' Switch': '',
r', ROM': ' - ROM',
r' revision': 'revision',
r' IronWare': 'IronWare'
}
我在这里找到下面的代码,但是字典中的前三个模式不起作用,其余的都可以,我不知道为什么:
def multiple_replace(myDict, text):
regex = re.compile(r'(%s)' % '|'.join(map(re.escape, myDict.keys())))
return regex.sub(lambda mo: myDict.get(mo.group(), mo.group()),text)
如何修改上述功能,以便能够正确运行前三个模式的RegEX?我在这里尝试了大多数类似的解决方案,但没有一个能够处理前三种模式。
下面是我的简单版本,但我真的很感兴趣,因为我还是python的新手,因此应该如何修改第一个解决方案才能正常工作:
def multiple_replace(myDict, text):
for key, val in myDict.items():
if re.search(key, text):
text = re.sub(key, val, text)
return text
以下是输出示例:
HP J9856A 2530-24G-2SFP+ Switch, revision YA.16.05.0004, ROM YA.15.20 (/ws/swbuildm/rel_venice_qaoff/code/build/lakes(swbuildm_rel_venice_qaoff_rel_venice)) (Formerly ProCurve),.1.3.6.1.4.1.11.2.3.7.11.166
ProCurve J9088A Switch 2610-48, revision R.11.122, ROM R.10.06 (/sw/code/build/nemo),.1.3.6.1.4.1.11.2.3.7.11.77
Ruckus Wireless, Inc. ICX7250-48-HPOE, IronWare Version 08.0.70aT211 Compiled on Jan 18 2018 at 04:21:25 labeled as SPS08070a,.1.3.6.1.4.1.1991.1.3.62.2.2.1.1
以及我需要成为什么:
HP J9856A 2530-24G-2SFP+,revision YA.16.05.0004 - ROM YA.15.20,.1.3.6.1.4.1.11.2.3.7.11.166
HP J9088A 2610-48,revision R.11.122 - ROM R.10.06,.1.3.6.1.4.1.11.2.3.7.11.77
ICX7250-48-HPOE,IronWare Version 08.0.70aT211 SPS08070a,.1.3.6.1.4.1.1991.1.3.62.2.2.1.1
老实说,我不知道哪个更好或更快速,您的意见受到赞赏。
谢谢
答案 0 :(得分:1)
您应该确保所有键都是已编译的re
对象,并且一旦准备好正则表达式替换字典,就需要遍历这些键值对并逐个执行替换,与
for rx,repl in myDict.items():
text = rx.sub(repl, text)
其中rx
是已编译的re
对象,repl
是替换字符串。
完整代码段:
import re
myDict = {
re.compile(r' \(\/sw.+\)'): '',
re.compile(r' \(\/ws.+\)'): '',
re.compile(r'Compiled on.{36}'): '',
re.compile(re.escape(r'Ruckus Wireless, Inc. ')): '',
re.compile(re.escape(r'Brocade Communications Systems, Inc. ')): '',
re.compile(re.escape(r' Switch')): '',
re.compile(re.escape(r', ROM')): ' - ROM',
re.compile(re.escape(r' revision')): 'revision',
re.compile(re.escape(r' IronWare')): 'IronWare'
}
s = """HP J9856A 2530-24G-2SFP+ Switch, revision YA.16.05.0004, ROM YA.15.20 (/ws/swbuildm/rel_venice_qaoff/code/build/lakes(swbuildm_rel_venice_qaoff_rel_venice)) (Formerly ProCurve),.1.3.6.1.4.1.11.2.3.7.11.166
ProCurve J9088A Switch 2610-48, revision R.11.122, ROM R.10.06 (/sw/code/build/nemo),.1.3.6.1.4.1.11.2.3.7.11.77
Ruckus Wireless, Inc. ICX7250-48-HPOE, IronWare Version 08.0.70aT211 Compiled on Jan 18 2018 at 04:21:25 labeled as SPS08070a,.1.3.6.1.4.1.1991.1.3.62.2.2.1.1"""
def multiple_replace(myDict, text):
for rx,repl in myDict.items():
text = rx.sub(repl, text)
return text
print(multiple_replace(myDict, s))
请参见Python demo。
输出:
HP J9856A 2530-24G-2SFP+,revision YA.16.05.0004 - ROM YA.15.20,.1.3.6.1.4.1.11.2.3.7.11.166
ProCurve J9088A 2610-48,revision R.11.122 - ROM R.10.06,.1.3.6.1.4.1.11.2.3.7.11.77
ICX7250-48-HPOE,IronWare Version 08.0.70aT211 SPS08070a,.1.3.6.1.4.1.1991.1.3.62.2.2.1.1