<p>IIUC这里有一种使用regex的方法:</p>
<pre><code>full_pattern = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/\d{1,3} \[\d+/\d+]"
small_pattern = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/\d{1,3}"
msroutes = [
"B 10.34.86.0/24 [20/0] via 10.15.33.73, 2w3d",
"B 10.34.93.0/24 [20/0] via 10.15.33.73, 2w3d",
"O E1 10.34.95.0/24",
"B 10.34.97.0/24 [20/0] via 10.15.33.73, 2w0d",
"B 10.34.98.0/24 [20/0] via 10.15.33.73, 2w3d"
]
for line in msroutes:
finalpass = re.findall(full_pattern, line)
if finalpass:
finalpass = re.findall(small_pattern, finalpass[0])
finalpass = finalpass[0].split('/')
print(finalpass)
#['10.34.86.0', '24']
#['10.34.93.0', '24']
#['10.34.97.0', '24']
#['10.34.98.0', '24']
</code></pre>
<p>因为我不确定是否有更简单的方法来忽略您要求忽略的行(可能是检查它是否以<code>'B'</code>开头还是以<code>'O'</code>开头?),我做了两次正则表达式搜索。第一种方法寻找与模式类似的东西:</p>
<pre><code>##.##.##.##/## [##/#]
</code></pre>
<p>其中<code>#</code>表示一个数字。模式<code>\d{1,3}</code>表示1到3位数之间的匹配。这将消除其中没有<code>[20/0]</code>的行。你知道吗</p>
<p>接下来,对于匹配的行,我执行较小的regex搜索,只得到IP和Mask值。我们不必对这个进行错误检查,因为我们知道它已经匹配了更大的模式。你知道吗</p>
<hr/>
<p>如果您知道只想处理以<code>'B'</code>开头的行:</p>
<pre><code>for line in msroutes:
if line.startswith('B'):
finalpass = re.findall(small_pattern, line)[0].split('/')
print(finalpass)
#['10.34.86.0', '24']
#['10.34.93.0', '24']
#['10.34.97.0', '24']
#['10.34.98.0', '24']
</code></pre>
<hr/>
<p>也可以不使用长regex模式,只使用现有代码,将连续的空格视为一个空格,从而简化逻辑。你知道吗</p>
<pre><code>for line in msroutes:
firstpass = re.split(r'\s+', line)
if len(firstpass) > 1 and "/" in firstpass[1]:
finalpass = firstpass[1].split("/")
else:
finalpass = ["0.0.0.0", "0.0.0.0"]
print(finalpass)
#['10.34.86.0', '24']
#['10.34.93.0', '24']
#['0.0.0.0', '0.0.0.0']
#['10.34.97.0', '24']
#['10.34.98.0', '24']
</code></pre>
<p><code>\s+</code>表示匹配一个或多个空格。你知道吗</p>