python 在带多个 () 括号的字符串中重新进行正则表达式匹配

python re regex matching in string with multiple () parenthesis

我有这个字符串

cmd = "show run IP(k1) new Y(y1) add IP(dev.maintserial):Y(dev.maintkeys)"

首先要精确匹配的正则表达式是什么"IP(dev.maintserial):Y(dev.maintkeys)"

括号内可能有不同的路径,如(name.dev.serial),所以不会一直有一个点。

我想到了这样的事情: re.search('(IP\(.*?\):Y\(.*?\))', cmd) 但这也将匹配单个 IP(k1) 和 Y(y1

我的用法是:

If "IP(*):Y(*)" in cmd:
 do substitution of IP(dev.maintserial):Y(dev.maintkeys) to Y(dev.maintkeys.IP(dev.maintserial))

我怎样才能做上面的替换?在 if 条件下,我想按顺序进行此更改: from IP(path_to_IP_key):Y(path_to_Y_key) to Y(path_to_Y_key.IP(path_to_IP_key)) ,因此 IP 在点后的末尾位于 Y 内。

是这样的吗?

r"IP\(([^)]*\..+)\):Y\(([^)]*\..+)\)"

您可以 try it 使用您的字符串。它匹配整个字符串 IP(dev.maintserial):Y(dev.maintkeys) 与组 dev.maintserialdev.maintkeys.

RE 匹配 IP(、零个或多个不是右括号 ([^)]*) 的字符、句点 . (\.)、一个或多个任何字符 (.+),然后是 ):Y(,...(在括号之间——同上),).

示例用法

import re

cmd = "show run IP(k1) new Y(y1) add IP(dev.maintserial):Y(dev.maintkeys)"

# compile regular expression
p = re.compile(r"IP\(([^)]*\..+)\):Y\(([^)]*\..+)\)")

s = p.search(cmd)
# if there is a match, s is not None
if s:
    print(f"{s[0]}\n{s[1]}\n{s[2]}")
    a = "Y(" + s[2] + ".IP(" + s[1] + "))"
    print(f"\n{a}")

以上p.search(cmd)“[s]可以[s]到[cmd]寻找这个正则表达式[p]产生匹配的第一个位置,并且return[s]一个对应的匹配对象" (docs). None is the return value if there is no match. If there is a match, s[0] gives the entire match, s[1] gives the first parenthesized subgroup, and s[2] gives the second parenthesized subgroup (docs).

输出

IP(dev.maintserial):Y(dev.maintkeys)
dev.maintserial
dev.maintkeys

Y(dev.maintkeys.IP(dev.maintserial))

这应该有效,因为它更具限制性。 (IP\([^\)]+\):Y\(.*?\))

[^\)]+ 表示至少一个不是右括号的字符。

.*? 在你的里面太开放了,几乎任何东西都可以放进去,直到“):Y(

可以使用2个取反字符类 [^()]*匹配除括号外的任何字符,省略外层捕获组仅匹配。

为防止部分单词匹配,您可以开始匹配 IP 与单词边界 \b

\bIP\([^()]*\):Y\([^()]*\)

Regex demo