我有下面这样的文件,它是包含ruledefs(即rd-6)引用的配置的一部分。除了rulebase和ruledefs名称外,配置文件结构看起来总是相同的。 这一部分是规则库定义(出于这个目的,这也是我的RB-定义.txt)在
##Rulebase-definition
rulebase bb
action priority 6 dynamic-only ruledef rd-6 charging-action throttle monitoring-key 1
action priority 7 dynamic-only ruledef rd-7 charging-action p2p_Drop
action priority 139 dynamic-only ruledef rd-8 charging-action p2p_Drop monitoring-key 1
#exit
这是ruledef定义的例子(这也是我在这个问题中寻找的输出)
^{pr2}$我能够匹配raw_input()给出的specyfic规则库名称(带有规则库定义),并将其保存到RB文件中-定义.txt正如你在上面看到的。 我还能够匹配来自RB的ruledef名称(但仅限于名称)-定义.txt并将其与以下内容一起存储在ruledef_列表中
RDFile = open('RB-definitions.txt')
txt2 = RDFile.read()
ruledef_list = []
for match2 in re.findall((?<=ruledef)((?:.|\n)*?)(?=charging-action), txt2):
print match2 +"\n"
ruledef_list.append(match2)
但是当我必须从上面显示的ruledef定义中匹配特定的ruledef时,我总是失败。 ruledef单词总是排在第一位
start_tag = '^ruledef ' #additional space char
content = '((?:.|\n)*?)'
end_tag = '#exit'
for RD_name in ruledef_list:
print RD_name
for match in re.findall(start_tag + RD_name + content + end_tag, txt):
print match + end_tag + "\n"
我试过使用“^ruledef”、“^ruledef\s+”甚至“([ruledef])\b”,但这些都不起作用。 我必须计算第一个单词,因为如果不匹配,我也将匹配从rulebase defitnition开始的部分。在
如何将行中定义的第一个单词与下一个“#exit”匹配? 作为输出,我可以得到以下结果
ruledef rd-8
ip server-ip-address range host-pool BB10_RIM_1
ip server-ip-address range host-pool BB10_RIM_2
#exit
ruledef rd-3
ip any-match = TRUE
#exit
为了更好地理解,请在此处找到带有示例配置的整个脚本http://pastebin.com/q3VUeAdh
缺少多行模式。否则,
^
只匹配整个字符串的开头。另外,您可以通过使用singleline/dotall模式来避免(?:.|\n)
(它使.
匹配任何字符):请注意,这将给出
^{pr2}$ruledef
的内容(即,只有content
部分匹配的内容-不ruledef
,没有名称,没有#exit). If this is not what you want, simply remove the parentheses in
内容`:顺便说一句,使用否定的前瞻性而不是不整洁的量词可能更有效(但是,如果速度是您的重要关注点,则不必—请对此进行概述):
^{3}$最后,请注意我是如何对所有regex模式使用原始字符串的。这是Python中的一个很好的实践,否则您可能会遇到复杂转义模式的问题(例如,您必须对某些东西进行双重转义)。在
相关问题 更多 >
编程相关推荐