Python 贪婪和非贪婪正则表达式的使用问题

Python 贪婪和非贪婪正则表达式的使用问题,python,regex,non-greedy,Python,Regex,Non Greedy,我不明白我做错了什么。我只需要提取路由器名称和端口号。 路由器名称为“C1900_-ROUTER1_-SR7”,端口为“4/1/4”,它可以存在“B:C1900_-ROUTER1_-SR7…”而不是“A:C1900_-ROUTER1_-SR7…” string=“A:C1900_路由器1_SR7” A:C1900_路由器1_SR7#echo“” 答:C1900_路由器1_SR7#/环境不再 A:C1900_路由器1_SR7# A:C1900_路由器1_SR7#显示端口4/1/4 " regex_

我不明白我做错了什么。我只需要提取路由器名称和端口号。 路由器名称为“
C1900_-ROUTER1_-SR7
”,端口为“4/1/4”,它可以存在“
B:C1900_-ROUTER1_-SR7
…”而不是“
A:C1900_-ROUTER1_-SR7
…”

string=“A:C1900_路由器1_SR7”
A:C1900_路由器1_SR7#echo“”
答:C1900_路由器1_SR7#/环境不再
A:C1900_路由器1_SR7#
A:C1900_路由器1_SR7#显示端口4/1/4
"
regex_S2='(A | B):(?P.?)\s*显示端口\s*(?P.?)\s*\n'
match_L0_iter=re.findall(regex_S2,string,flags=re.DOTALL)

routername捕获的组结果=
“C1900_ROUTER1_SR7#A:C1900_ROUTER1_SR7#echo”“A:C1900_ROUTER1_SR7#/environment不再是A:C1900_ROUTER1_SR7#A:C1900_ROUTER1_SR7”
您可以更新模式以匹配末尾的非空格字符,而不是非贪婪的
来匹配路由器名称,您还可以使用
[^#]+
匹配除
.
之外的任何字符

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

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


如果必须匹配行的其余部分(包括换行符),则可以在模式中附加
\s*\n

可以更新模式以匹配末尾的非空白字符,而不是非贪婪的
*?
来匹配路由器名称,还可以使用
[^\35;]+
匹配除
#

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

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


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

删除
re.DOTALL
,请参见“是”,但忘了说这是一个.txt文件,而且有很多这样的行!如果删除re.DOTALL,则不会匹配整个字符串。我需要在路由器名称后继续匹配其他单词。删除
re.DOTALL
,请参见“是”,但忘记说这是一个.txt文件,并且有很多类似的行!如果删除re.DOTALL,则不会匹配整个字符串。我需要在路由器名称后继续匹配其他单词。