首页 > 解决方案 > 使用贪婪和非贪婪正则表达式的问题

问题描述

我不明白我做错了什么。我只需要提取 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"

标签: pythonregexnon-greedy

解决方案


您可以更新您的模式以匹配末尾的非空白字符而不是非贪婪字符.*?为了匹配路由器名称,您还可以使用匹配除 a 之外的任何字符的否定字符类 [^#]+#

要匹配 A 或 B,您可以使用字符类。

[AB]:(?P<routername>[^#]+)#\s*show port\s*(?P<port>\S+)

正则表达式演示

如果您必须匹配该行的其余部分,包括换行符,您可以\s*\n按照您的模式追加。


推荐阅读