<p>好吧,我测试过你的代码,刚开始有一个结果,第二个结果是:</p>
<pre><code>>>> ['Tg0_0_0_7_0', '13.13.13.1', '255.255.255.0']
</code></pre>
<p>然后,我仔细查看了正则表达式中的内容,似乎您可能在第二段之前有额外的新行,就像我在第一段之前那样,从而导致\S停止。你可以用(如果我对你得到单一结果的原因是正确的话)用添加\s?要开始正则表达式:</p>
^{pr2}$
<p>或者,如果是简单接口和IP检索,您可以使用更简单、更快的拆分…<br/>
如果有人好奇,我甚至会计时:</p>
<pre><code>import timeit
import re
if_config_output = """
Mg0_RSP0_CPU0_0 Link encap:Ethernet HWaddr 70:e4:22:32:53:42
inet addr:20.200.130.1 Mask:255.255.0.0
inet6 addr: fe80::72e4:22ff:fe32:5342/64 Scope:Link
UP RUNNING NOARP MULTICAST MTU:1514 Metric:1
RX packets:147918 errors:0 dropped:0 overruns:0 frame:0
TX packets:119226 errors:0 dropped:0 overruns:0 carrier:3
collisions:0 txqueuelen:1000
RX bytes:103741434 (98.9 MiB) TX bytes:5320623 (5.0 MiB)
Tg0_0_0_7_0 Link encap:Ethernet HWaddr 78:ba:f9:35:66:46
inet addr:13.13.13.1 Mask:255.255.255.0
inet6 addr: fe80::7aba:f9ff:fe35:6646/64 Scope:Link
UP RUNNING NOARP MULTICAST MTU:1514 Metric:1
RX packets:26 errors:0 dropped:0 overruns:0 frame:0
TX packets:5058 errors:0 dropped:0 overruns:0 carrier:3
collisions:0 txqueuelen:1000
RX bytes:1832 (1.7 KiB) TX bytes:454625 (443.9 KiB)
"""
ma = re.compile("^\s?(\S+).*?inet addr:(\S+).*?Mask:(\S+)", re.MULTILINE|re.DOTALL)
def split(paragraph):
""" ugly, but faster """
interface = paragraph.split(" Link ")[0]
inet_mask = paragraph.split("\n")[1].split(':')
ip, mask = inet_mask[1], inet_mask[2]
return [interface, ip, mask]
def regex(paragraph):
result = ma.match(paragraph)
if result:
result = ma.match(paragraph)
interface = result.group(1)
ip = result.group(2)
mac = result.group(3)
return [interface, ip, mac]
def test_split():
c = []
for paragraph in if_config_output.split('\n\n'):
c.append(split(paragraph))
return len(c)
def test_regex():
c = []
for paragraph in if_config_output.split('\n\n'):
c.append(regex(paragraph))
return len(c)
print ("split", timeit.timeit(stmt=test_split, number=100000))
print ("regex", timeit.timeit(stmt=test_regex, number=100000))
</code></pre>
<p>结果</p>
<pre><code>$ python version
Python 2.7.3
$ python test.py
('split', 3.096487045288086)
('regex', 5.066282033920288)
$ python3 version
Python 3.2.3
$ python3 test.py
split 4.155041933059692
regex 4.875624895095825
$ python3 test.py
split 4.787220001220703
regex 5.695119857788086
</code></pre>
<p>有人想加入Python3.5吗?在</p>
<p>嗯,奇怪的是没有结论。在</p>
<pre><code>results from repl.it/languages/python3 (Python 3.4.0)
split 1.2351078800020332
regex 1.3363793969983817
results from ideone.com (Python 2.7.9)
('split', 0.9004449844360352)
('regex', 0.7017428874969482)
and from ideone.com (Python 3.4.3+)
split 1.2050538789480925
regex 1.7611852046102285
</code></pre>