正则表达式 - 从String到String匹配

时间:2017-11-07 07:30:52

标签: python regex

我需要从几个文件中获取一个字符串,该字符串以:

开头
line vty (digit) (digit)

然后可能没有,一个或多个换行符,其中包含最终文本,直到这一行出现:

 access-class (some more text)

简而言之,我如何匹配这些行之间的所有内容,包括他们自己。

仅供参考:我想用Python做到这一点。

尝试:

(?<=line vty)(.*)(?=access-class)
(?<=line vty)[a-zA-Z0-9\s\n\t]*(?=access-class)
(?<=line vty)(.*\n)*(?=access-class)

示例:

line vty 0 4
 session-timeout 6000 
 access-class ACL-4-MGMT-VTY-IN in vrf-also
 exec-timeout 30 30
 logging synchronous
 transport input ssh
!
line vty 5 15
 session-timeout 6000
 exec-timeout 30 30
 logging synchronous
 transport input ssh 
 access-class ACL-4-MGMT-VTY-IN in vrf-also

2 个答案:

答案 0 :(得分:0)

诀窍是使用单行模式(即.匹配所有内容,包括换行符。这可以通过将正则表达式置于(?s)之前或使用Python中的re.DOTALL标志来完成。由于"line vty (digits) (digits)"根据位数可以有一个可变长度,因此不能使用正面的后视。

相反,只需使用正则表达式(?s)line vty \d+ \d+\s*(.*?)\s*access-class并提取第一个捕获组的内容。

Demo and step-by-step explanation.

答案 1 :(得分:0)

您可以这样做:

import re
string_1="""line vty 0 400
 session-timeout 6000
 access-class ACL-4-MGMT-VTY-IN in vrf-also
 exec-timeout 30 30
 logging synchronous
 transport input ssh
!
line vty 5 15
 session-timeout 6000
 exec-timeout 30 30
 logging synchronous
 transport input ssh
 access-class ACL-4-MGMT-VTY-IN in vrf-also"""

pattern=r"line vty(.*?)access-class"

match=re.finditer(pattern,string_1,re.IGNORECASE | re.DOTALL)
for group in match:
    print(group.group())

输出:

line vty 0 400
 session-timeout 6000
 access-class
line vty 5 15
 session-timeout 6000
 exec-timeout 30 30
 logging synchronous
 transport input ssh
 access-class