我有如下文件,它是配置的一部分,其中包含对Ruledef的引用(即rd-6)。除了rulebase和ruledefs名称外,配置文件结构始终看起来相同。
这部分是rulebase-definition(出于这个问题的目的,这也是我的RB-definitions.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-definition示例(这也是我在提出此问题时所寻找的输出)

##Ruledef-definition
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


我能够匹配raw_input()给定的特定规则库名称(具有规则库定义),并将其保存到文件RB-definitions.txt中,如上所示。
我还能够匹配RB-definitions.txt中的ruledef名称(但只有名称),并将其存储在ruledef_list中,如下所示

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-defitnition中匹配特定的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',但是这些都不起作用。
我必须对第一个单词进行数学运算,因为如果没有,我还将匹配“ ruledef”开头的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中找到带有示例配置的整个脚本。

最佳答案

您缺少多行模式。否则,^仅在整个字符串的开头匹配。另外,可以通过使用单行/ dotall模式(使(?:.|\n)匹配任何字符)来避免.

start_tag = r'^ruledef ' #additional space char
content = r'(.*?)'
end_tag = r'#exit'

...

for match in re.findall(start_tag + RD_name + content + end_tag, txt, re.M|re.S):
    ...


请注意,这将为您提供ruledef的内容(即仅由content部分匹配的内容-没有ruledef,没有名称,没有#exit). If this is not what you want, simply remove the parentheses in content`:

...
content = r'.*?'
...


顺便说一句,使用负前瞻而不是贪婪的量词可能会更有效(但不必这样做-如果速度是您的重要考虑因素,请对此进行简要介绍):

...
content = r'(?:(?!#exit).)*'
...


最后,请注意我如何对所有正则表达式模式使用原始字符串。这只是Python中的好习惯-否则您可能会遇到复杂的转义模式问题(即,您必须对某些事情进行两次转义)。

关于python - python regex将行开头的定义单词与另一行的定义单词之间的所有内容匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17391943/

10-10 09:07