Python Regex:如果找到则如何追加字符串,否则附加“Not Found”?

时间:2016-06-16 22:38:30

标签: python regex

如果找到,我试图将结果附加到列表中,如果找不到匹配项,则将字符串“N / A”附加到列表中。 show_version_lists是来自各种网络设备的日志列表。

import re

for result in show_version_list:

    for matchedtext in re.findall(r'(?<=Version).*?(?=-)',result)[:1]:

        if re.search(r'(?<=Version).*?(?=-)',result):

            version_numbers_xe.append(matchedtext)

        else:

            version_numbers_xe.append('n/a')

当我运行上面的代码时,其他条件永远不会发生。

其中一个应匹配的日志的示例

Load for five secs: 5%/0%; one minute: 4%; five minutes: 4%
Time source is NTP, 15:24:47.756 PDT Thu Jun 16 2016
Cisco IOS XE Software, Version 03.16.01a.S - Extended Support Release
Cisco IOS Software, ASR1000 Software (PPC_LINUX_IOSD-ADVENTERPRISEK9-M), Version 15.5(3)S1a, RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2015 by Cisco Systems, Inc.
Compiled Wed 04-Nov-15 17:40 by mcpre

其中一个不匹配的日志示例。

Cisco IOS Software, C3750E Software (C3750E-UNIVERSALK9-M), Version   15.2(2)E3, RELEASE SOFTWARE (fc3)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2015 by Cisco Systems, Inc.
Compiled Wed 26-Aug-15 06:14 by prod_rel_team

编辑:

AChampion你正确地取出for循环修复了逻辑问题。

2 个答案:

答案 0 :(得分:1)

问题在于你的代码逻辑。您的代码基本上是这样说的:

在所有情况下,您都会在匹配文本中找到正则表达式结果 *如果你找到相同的正则表达式结果x *如果不是(你总是会)做y(所以你永远不会发生)

例如,将逻辑更改为: 对于 matchedtext'来源中的所有数据 如果你发现正则表达式结果打印x, 否则打印“不适用”

答案 1 :(得分:1)

使用re.finditer

finditer返回一个匹配对象,我们可以使用re.group从匹配对象中附加版本信息。它就这么简单。

import re

version_numbers_xe = []

for result in show_version_list:
    found = False
    for match in re.finditer(r'(?<=Version).*?(?=-)',result):
        version_numbers_xe.append(match.group())
        found = True
    if not found:
        version_numbers_xe.append(None)

出于性能原因,我建议您预先编译正则表达式,以产生以下内容:

import re

version_numbers_xe = []
version_regex = re.compile(r'(?<=Version).*?(?=-)')

for result in show_version_list:
    found = False
    for match in version_regex.finditer(result):
        version_numbers_xe.append(match.group())
        found = True
    if not found:
        version_numbers_xe.append(None)

这摆脱了最后一场比赛的完整性检查,但我不确定你为什么要这样做。