python - 匹配模式的正则表达式。一个跳过换行符和字符直到模式。二

标签 python regex

我需要有关多行跳过直到模式的正则表达式的帮助,但看不到它已经涵盖。

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] ...等等。

最佳答案

要匹配包含tengigecarrier-delay最近 行之间的内容,您需要 tempered greedy token (或展开的版本):

(?sim)^([^\n]*TenGigE[^\n]*)(?:(?!TenGigE|carrier-delay).)*([^\n]*carrier-dela‌​y[^\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/

相关文章:

python - 函数名中的数字

python - 用于 Python 3.0 的 Py2exe

javascript - 大括号上的 JS 正则表达式

php - 评估和逻辑表达式检查

c - Posix 正则表达式非贪婪

regex - 在 grep 命令中使用 + 时,为什么需要转义?

python - 如何以编程方式检测代码是在 nuitka 编译模式还是 python 解释模式下运行

python - 将 CURL 命令转换为带有表单参数的 POST Python 请求

python - 缺少 1 个必需的位置参数 : 'msg'

javascript - 匹配所有字符减去尾随空格,然后匹配大括号之间的字符