我是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()
'''
答案 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):
(假设这当然是正确的模式-在没有看到真实数据的情况下很难确定)