<p>如果要使用模式,可以使用3个捕获组,1个用于mac地址,1个用于通道,1个用于RSSI值:</p>
<pre><code>Roam candidate# ?\d+ ((?:[0-9A-Fa-f]{2}[:-]){5}(?:[0-9A-Fa-f]){2}) on channel (\d+) +RSSI: (-?\d+)
</code></pre>
<p>在较小的部分:</p>
<ul>
<li><code>Roam candidate# ?\d+</code>匹配<em>漫游候选#</em>,可选空格和1+数字</li>
<li><code>((?:[0-9A-Fa-f]{2}[:-]){5}(?:[0-9A-Fa-f]){2})</code>捕获组1,匹配mac地址</li>
<li><code>on channel (\d+) +</code>在通道</em>上匹配<em>,空格后在组2 1+中捕获</li>
<li><code>RSSI: (-?\d+)</code>匹配<em>RSSI:</em>,空格并在第3组中捕获一个可选的<code>-</code>和1+数字</li>
</ul>
<p><a href="https://regex101.com/r/vKeVHv/2" rel="nofollow noreferrer">Regex demo</a>| <a href="https://ideone.com/1nNq40" rel="nofollow noreferrer">Python demo</a></p>
<p>例如</p>
<pre><code>import re
strings = ["Roam candidate# 9 F4:CF:E2:5E:73:3F on channel 161 RSSI: -70", "Roam candidate#10 F4:CF:E2:62:02:2F on channel 11 RSSI: -70"]
regex = r"Roam candidate# ?\d+ ((?:[0-9A-Fa-f]{2}[:-]){5}(?:[0-9A-Fa-f]){2}) on channel (\d+) +RSSI: (-?\d+)"
for s in strings:
print(re.findall(regex, s, re.M))
</code></pre>
<p>结果</p>
<blockquote>
<p>[('F4:CF:E2:5E:73:3F', '161', '-70')]</p>
<p>[('F4:CF:E2:62:02:2F', '11', '-70')]</p>
</blockquote>