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.maintserial
和 dev.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\([^()]*\)
我有这个字符串
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.maintserial
和 dev.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\([^()]*\)