我需要有关多行跳过直到模式的正则表达式的帮助,但看不到它已经涵盖。
Name of person
Jack
Nichol
Age 42
.....
.....
....
Name of person
Andrew
Jason
Age 54
...
... ...
我如何匹配 - 类似于 (Name.*(?:(\n)+).*(?:Age))
考虑以下 -
interface TenGigE0/0/0/7
shutdown
!
interface TenGigE0/0/0/8
bundle id 221 mode active
lacp period short
lacp period short receive 100
lacp period short transmit 100
carrier-delay up 100 down 100
load-interval 30
frequency synchronization
!
transceiver permit pid all
!
interface TenGigE0/0/0/9
mtu 9216
frequency synchronization
!
transceiver permit pid all
!
interface TenGigE0/0/0/10
bundle id 237 mode active
lacp period short
lacp period short receive 100
lacp period short transmit 100
carrier-delay up 120000 down 150
load-interval 30
frequency synchronization
如何匹配所有 tengigex/x/x/x 和相应的载波延迟线。
像下面一样-
[ interface TenGigE0/0/0/8, carrier-delay up 100 down 100] [ interface TenGigE0/0/0/10, carrier-delay up 120000 down 150] ...等等。
最佳答案
要匹配包含tengige
和carrier-delay
的最近 行之间的内容,您需要 tempered greedy token (或展开的版本):
(?sim)^([^\n]*TenGigE[^\n]*)(?:(?!TenGigE|carrier-delay).)*([^\n]*carrier-delay[^\n]*)
参见 regex demo
参见 Python demo :
import re
p = re.compile(r'^([^\n]*TenGigE[^\n]*)(?:(?!TenGigE|carrier-delay).)*([^\n]*carrier-delay[^\n]*)', re.DOTALL | re.M | re.I)
test_str = "interface TenGigE0/0/0/8\n bundle id 221 mode active\n lacp period short\n lacp period short receive 100\n lacp period short transmit 100\n carrier-delay up 100 down 100\n\ninterface TenGigE0/0/0/7\n\n\n\nshutdown\n\n!\n\ninterface TenGigE0/0/0/8\n\n\n\n bundle id 221 mode active\n\n lacp period short\n\n lacp period short receive 100\n\n lacp period short transmit 100\n\n carrier-delay up 100 down 100\n\n load-interval 30\n\n frequency synchronization\n\n !\n\n transceiver permit pid all\n\n!\n\ninterface TenGigE0/0/0/9\n\n\n\n mtu 9216\n\n frequency synchronization\n\n !\n\n transceiver permit pid all\n\n!\n\ninterface TenGigE0/0/0/10\n\n\n\n bundle id 237 mode active\n\n lacp period short\n\n lacp period short receive 100\n\n lacp period short transmit 100\n\n carrier-delay up 120000 down 150\n\n load-interval 30\n\n frequency synchronization"
print(p.findall(test_str))
# => [('interface TenGigE0/0/0/8', 'carrier-delay up 100 down 100'), ('interface TenGigE0/0/0/8', 'carrier-delay up 100 down 100'), ('interface TenGigE0/0/0/10', 'carrier-delay up 120000 down 150')]
更新
基于展开循环技术(unrolled tempered greedy token)提取相同文本的非常强大的正则表达式:
(?sim)^([^\n]*TenGigE[^\n]*\n)[^T\n]*(?:T(?!enGigE)[^T\n]*|\n(?! carrier-delay)[^T\n]*)*(\n carrier-delay[^\n]*)
参见 regex demo
关于python - 匹配模式的正则表达式。一个跳过换行符和字符直到模式。二,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37023556/