python正则表达式将行开头的已定义单词与其他lin中定义的单词之间的所有内容进行匹配

2024-05-18 06:54:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面这样的文件,它是包含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


Tags: iptxt名称定义规则tagexitaction
1条回答
网友
1楼 · 发布于 2024-05-18 06:54:04

缺少多行模式。否则,^只匹配整个字符串的开头。另外,您可以通过使用singleline/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内容`:

^{pr2}$

顺便说一句,使用否定的前瞻性而不是不整洁的量词可能更有效(但是,如果速度是您的重要关注点,则不必—请对此进行概述):

^{3}$

最后,请注意我是如何对所有regex模式使用原始字符串的。这是Python中的一个很好的实践,否则您可能会遇到复杂转义模式的问题(例如,您必须对某些东西进行双重转义)。在

相关问题 更多 >