Python - 显式匹配字符串中的字符串
Python - matching a string within a string explicitly
我正在尝试匹配特定的路由器接口。但是,我发现以下内容令人困惑,当搜索特定接口编号时,它在第一个条件下匹配,而我认为它应该在第二个条件下匹配:
string = ["TenGigE0/0/0/0.12", "TenGigE0/0/0/1.46", "TenGigE0/0/0/15.55"]
for item in string:
if 'TenGigE0/0/0/0' in item or 'TenGigE0/0/0/1' in item:
print("Yes")
elif 'TenGigE0/0/0/15' in item:
print("cool")
输出为:
Yes
Yes
Yes
我该如何解决这个问题?
更改 if 语句:
string = ["TenGigE0/0/0/0.12", "TenGigE0/0/0/1.46", "TenGigE0/0/0/15.55"]
for item in string:
if 'TenGigE0/0/0/15' in item:
print("cool")
elif ('TenGigE0/0/0/0' in item) or ('TenGigE0/0/0/1' in item):
print("Yes")
会给你:
Yes
Yes
cool
因为 TenGigE0/0/0/15
也包含 TenGigE0/0/0/1
,如果您在检查 TenGigE0/0/0/15
之前检查 TenGigE0/0/0/1
,第一个 if 语句的结果为 True
让我们想象一下:
'TenGigE0/0/0/0'
in 'TenGigE0/0/0/0.12'
为真,因为 'TenGigE0/0/0/0'
是 'TenGigE0/0/0/0.12'
:
的子字符串
TenGigE0/0/0/0.12
TenGigE0/0/0/0
'TenGigE0/0/0/1'
in 'TenGigE0/0/0/1.46'
为真,因为 'TenGigE0/0/0/1'
是 'TenGigE0/0/0/1.46'
:
的子串
TenGigE0/0/0/1.46
TenGigE0/0/0/1
'TenGigE0/0/0/15.55'
也一样:
TenGigE0/0/0/15.55
TenGigE0/0/0/1
if
语句在第一个条件之后执行代码True
,所以即使'TenGigE0/0/0/15' in 'TenGigE0/0/0/15.55'
为True,'TenGigE0/0/0/1' in 'TenGigE0/0/0/15.55'
是第一个,所以这就是被执行的。
正如其他答案中已经提到的,'/1'
是 '/15'
的子字符串。
另一种解决方案是将 regex 与单词绑定 \b
和 '0'
或 '1'
:[=17= 的组一起使用]
import re
string = ["TenGigE0/0/0/0.12", "TenGigE0/0/0/1.46", "TenGigE0/0/0/15.55"]
for item in string:
if re.match(r'TenGigE0/0/0/(0|1)\b', item):
print("Yes")
elif re.match(r'TenGigE0/0/0/15\b', item):
print("cool")
输出:
Yes
Yes
cool
我正在尝试匹配特定的路由器接口。但是,我发现以下内容令人困惑,当搜索特定接口编号时,它在第一个条件下匹配,而我认为它应该在第二个条件下匹配:
string = ["TenGigE0/0/0/0.12", "TenGigE0/0/0/1.46", "TenGigE0/0/0/15.55"]
for item in string:
if 'TenGigE0/0/0/0' in item or 'TenGigE0/0/0/1' in item:
print("Yes")
elif 'TenGigE0/0/0/15' in item:
print("cool")
输出为:
Yes
Yes
Yes
我该如何解决这个问题?
更改 if 语句:
string = ["TenGigE0/0/0/0.12", "TenGigE0/0/0/1.46", "TenGigE0/0/0/15.55"]
for item in string:
if 'TenGigE0/0/0/15' in item:
print("cool")
elif ('TenGigE0/0/0/0' in item) or ('TenGigE0/0/0/1' in item):
print("Yes")
会给你:
Yes
Yes
cool
因为 TenGigE0/0/0/15
也包含 TenGigE0/0/0/1
,如果您在检查 TenGigE0/0/0/15
之前检查 TenGigE0/0/0/1
,第一个 if 语句的结果为 True
让我们想象一下:
的子字符串'TenGigE0/0/0/0'
in'TenGigE0/0/0/0.12'
为真,因为'TenGigE0/0/0/0'
是'TenGigE0/0/0/0.12'
:TenGigE0/0/0/0.12 TenGigE0/0/0/0
的子串'TenGigE0/0/0/1'
in'TenGigE0/0/0/1.46'
为真,因为'TenGigE0/0/0/1'
是'TenGigE0/0/0/1.46'
:TenGigE0/0/0/1.46 TenGigE0/0/0/1
'TenGigE0/0/0/15.55'
也一样:TenGigE0/0/0/15.55 TenGigE0/0/0/1
if
语句在第一个条件之后执行代码True
,所以即使'TenGigE0/0/0/15' in 'TenGigE0/0/0/15.55'
为True,'TenGigE0/0/0/1' in 'TenGigE0/0/0/15.55'
是第一个,所以这就是被执行的。
正如其他答案中已经提到的,'/1'
是 '/15'
的子字符串。
另一种解决方案是将 regex 与单词绑定 \b
和 '0'
或 '1'
:[=17= 的组一起使用]
import re
string = ["TenGigE0/0/0/0.12", "TenGigE0/0/0/1.46", "TenGigE0/0/0/15.55"]
for item in string:
if re.match(r'TenGigE0/0/0/(0|1)\b', item):
print("Yes")
elif re.match(r'TenGigE0/0/0/15\b', item):
print("cool")
输出:
Yes
Yes
cool