使用贪婪和非贪婪正则表达式的问题
Problem using greedy and non-greedy regular expressions
我不明白我做错了什么。我只需要提取 router_name 和端口号。
路由器名称是“C1900_ROUTER1_SR7
”,端口是“4/1/4”,它可以存在“B:C1900_ROUTER1_SR7
......”而不是“A:C1900_ROUTER1_SR7
...... ......
string = "A:C1900_ROUTER1_SR7#
A:C1900_ROUTER1_SR7# echo "<team:script>"
<team:script>
A:C1900_ROUTER1_SR7# /environment no more
A:C1900_ROUTER1_SR7#
A:C1900_ROUTER1_SR7# show port 4/1/4
"
regex_S2 = '(A|B):(?P<routername>.*?)#\s*show port\s*(?P<port>.*?)\s*\n'
match_L0_iter = re.findall(regex_S2, string, flags=re.DOTALL)
routername抓包结果="C1900_ROUTER1_SR7# A:C1900_ROUTER1_SR7# echo "<pnm:script>" <pnm:script> A:C1900_ROUTER1_SR7# /environment no more A:C1900_ROUTER1_SR7# A:C1900_ROUTER1_SR7"
您可以更新您的模式以匹配末尾的非空白字符而不是非贪婪 .*?
要匹配路由器名称,您还可以使用 negated character class [^#]+
匹配除 #
之外的任何字符
要匹配 A 或 B,您可以使用字符 class。
[AB]:(?P<routername>[^#]+)#\s*show port\s*(?P<port>\S+)
如果您必须匹配该行的其余部分以及换行符,您可以按照您的模式附加 \s*\n
。
我不明白我做错了什么。我只需要提取 router_name 和端口号。
路由器名称是“C1900_ROUTER1_SR7
”,端口是“4/1/4”,它可以存在“B:C1900_ROUTER1_SR7
......”而不是“A:C1900_ROUTER1_SR7
...... ......
string = "A:C1900_ROUTER1_SR7#
A:C1900_ROUTER1_SR7# echo "<team:script>"
<team:script>
A:C1900_ROUTER1_SR7# /environment no more
A:C1900_ROUTER1_SR7#
A:C1900_ROUTER1_SR7# show port 4/1/4
"
regex_S2 = '(A|B):(?P<routername>.*?)#\s*show port\s*(?P<port>.*?)\s*\n'
match_L0_iter = re.findall(regex_S2, string, flags=re.DOTALL)
routername抓包结果="C1900_ROUTER1_SR7# A:C1900_ROUTER1_SR7# echo "<pnm:script>" <pnm:script> A:C1900_ROUTER1_SR7# /environment no more A:C1900_ROUTER1_SR7# A:C1900_ROUTER1_SR7"
您可以更新您的模式以匹配末尾的非空白字符而不是非贪婪 .*?
要匹配路由器名称,您还可以使用 negated character class [^#]+
匹配除 #
要匹配 A 或 B,您可以使用字符 class。
[AB]:(?P<routername>[^#]+)#\s*show port\s*(?P<port>\S+)
如果您必须匹配该行的其余部分以及换行符,您可以按照您的模式附加 \s*\n
。