“ <string>中的正则表达式”要求将字符串作为左操作数,而不是列表

时间:2019-12-13 13:13:12

标签: python

我是python的新手,但我似乎找不到第二个脚本的原因 使用正则表达式时不起作用。

用例: 我想从一个目录中提取以“ crypto map IPSEC xx ipsec-isakmp”开头的条目 思科正在运行的配置文件并打印此行以及下一个4。 我设法在比赛后打印了行,但没有打印出匹配的行本身。 我的解决方法是首先静态打印文本“ crypto map IPSEC”。 然后,脚本将使用“ islice”将接下来的4行打印给我。 由于这并不完美,因此我想使用正则表达式。这根本不起作用。

>>>>>>
from itertools import islice
import re

#This works
print('Crypto map configurations: \n')
with open('show_run.txt', 'r') as f:
    for line in f:
        if 'crypto map IPSEC' and 'ipsec-isakmp' in line:
            print('crypto map IPSEC')
            print(''.join(islice(f, 4)))

f.close()

# The following does not work.
# Here I would like to use regular expressions to fetch the lines
# with "crypto map IPSEC xx ipsec-isakmp" 
#
'''
print('Crypto map configurations: \n')
with open('show_run.txt', 'r') as f:
    for line in f:
        pattern = r"crypto\smap\sIPSEC\s\d+\s.+"
        matched = re.findall(pattern, line)
        if str(matched) in line:
            print(str(matched))
            print(''.join(islice(f, 4)))
f.close()
'''

2 个答案:

答案 0 :(得分:2)

if 'crypto map IPSEC' and 'ipsec-isakmp' in line:

应为:

if 'crypto map IPSEC' in line and 'ipsec-isakmp' in line:

另一种选择(如果该行看起来像您在问题中描述的那样):

if line.startswith('crypto map IPSEC') and line.endswith('ipsec-isakmp'): ...

并在:

print(''.join(islice(f, 4)))

您可能想解析line而不是f

关于您的正则表达式问题:无需使用正则表达式来解析它(考虑此答案的前面部分),因为它的运行速度慢得多,通常很难维护。就是说,如果这个问题是为了学习,您可以这样做:

import re

line = 'crypto map IPSEC 12345 ipsec-isakmp'
pattern = r'crypto map IPSEC (\d+) ipsec-isakmp'
matched = re.findall(pattern, line)
if matched:
    print(matched[0])

请参见repl

答案 1 :(得分:0)

  

我想从Cisco正在运行的配置文件中提取以“ crypto map IPSEC xx ipsec-isakmp”开头的条目,并打印此行和下一个4。

然后您使它变得比必需的复杂得多:

for line in f:
    if line.startswith("crypto map IPSEC") and "ipsec-isakmp" in line:
        print(line.strip())
        for i in range(4):
            try:
                print next(f).strip()
            except StopIteration:
                # we're reached the end of file and there weren't 4 lines left
                # after the last "crypto map IPSEC" line. Sh!t happens...
                break

nb:如果您确实坚持使用正则表达式,请将第二行替换为

if re.match(r"^crypto map IPSEC \d+ ipsec-isakmp", line):

(假设这当然是正确的模式-在没有看到真实数据的情况下很难确定)