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

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+)

Regex demo

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