Python, использующий словарь для нескольких RegEX re.sub - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь манипулировать текстом из вывода SNMP sysDescr.0 с помощью Python 3, мне нужно использовать словарь, содержащий шаблоны и их замены следующим образом:

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

ЧестноЯ понятия не имею, что лучше или быстрее, ваш вклад приветствуется.

спасибо

1 Ответ

0 голосов
/ 18 февраля 2019

Вы должны убедиться, что все ключи являются скомпилированными 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
...