<p>使用像<code>nmap</code>这样的格式会更容易:</p>
<pre><code>192.168.1.1-255
</code></pre>
<p>现在,您可以:</p>
<pre><code>octets = '192.168.1.1-255'.split('.')
parsed_ranges = [map(int, octet.split('-')) for octet in octets]
</code></pre>
<p><code>parsed_ranges</code>看起来像<code>[[192], [168], [1], [1, 255]]</code>。从这里开始,用<code>itertools</code>生成地址很简单:</p>
<pre><code>import itertools
ranges = [range(r[0], r[1] + 1) if len(r) == 2 else r for r in parsed_ranges]
addresses = itertools.product(*ranges)
</code></pre>
<p>下面是一个简单的实现:</p>
<pre><code>import itertools
def ip_range(input_string):
octets = input_string.split('.')
chunks = [map(int, octet.split('-')) for octet in octets]
ranges = [range(c[0], c[1] + 1) if len(c) == 2 else c for c in chunks]
for address in itertools.product(*ranges):
yield '.'.join(map(str, address))
</code></pre>
<p>结果是:</p>
<pre><code>>>> for address in ip_range('192.168.1-2.1-12'): print(address)
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
192.168.1.8
192.168.1.9
192.168.1.10
192.168.1.11
192.168.1.12
192.168.2.1
192.168.2.2
192.168.2.3
192.168.2.4
192.168.2.5
192.168.2.6
192.168.2.7
192.168.2.8
192.168.2.9
192.168.2.10
192.168.2.11
192.168.2.12
</code></pre>