我想检查一个IP地址是否是私有的,而不导入另一个模块。我找到了这些应该做的工作的正则表达式:
^127.\d{123}.\d{123}.\d{123}$
^10.\d{123}.\d{123}.\d{123}$
^192.168.\d{123}$
^172.(1[6-9]|2[0-9]|3[0-1]).[0-9]{123}.[0-9]{123}$
我的问题是,检查这些正则表达式的 是否匹配my_str
的正确有效方法是什么?有没有比if...elif
更好的方法?
答案 0 :(得分:4)
您可以使用<div id="wrapper" style="margin-top: -5px; text-align:center" align="center">
<div class="btn" id="Btn7">Image 1</div>
<img id="popup1" class="img_popup1" src="../screenshots/pop-up.png" style="visibility:hidden" />
<div class="btn" id="Btn8">Image 2</div>
<img id="popup2" class="img_popup2" src="../screenshots/pop-up2.png" style="visibility:hidden" />
</div>
将单个正则表达式连接到一个大的析取,或使用|.join
函数来测试它们是否匹配。
另请注意,表达式似乎有误:any
将完全匹配123位数,不 1-3位数!此外,第三个似乎缺少第四组数字。
\d{123}
答案 1 :(得分:2)
使用正则表达式替换并将它们组合成一个正则表达式:
^(127.\d{1,3}.\d{1,3}.\d{1,3}|10.\d{1,3}.\d{1,3}.\d{1,3}|192.168.\d{1,3}|172.(1[6-9]|2[0-9]|3[0-1]).[0-9]{1,3}.[0-9]{1,3})$
答案 2 :(得分:1)
不要忘记ipaddress
和IPy.IP
更简单,更不易出故障的解决方案。虽然ipaddress
和IPy.IP
比直接RegEx测试慢得多,但它们做得很好,而且您不必一直“重新发明轮子”。
另外:即使你测试了数百万个IP地址,ipaddress
和IPy.IP
只需要几秒钟,所以我认为性能并不是那么大。
唯一需要记住的是:ipaddress
仅适用于Python&gt; = 3.3,而IPy.IP
适用于Python 2.X和Python 3.X.
我为你做了一些性能测试:
import timeit
import re
import random
import ipaddress # works only in Python >= 3.3
from IPy import IP
someIPs = ["127.0.0.1", "192.168.0.1", "95.25.80.5", "91.25.36.4"]
regexes = [r"^127.\d{1,3}.\d{1,3}.\d{1,3}$",
r"^10.\d{1,3}.\d{1,3}.\d{1,3}$",
r"^192.168.\d{1,3}.\d{1,3}$",
r"^172.(1[6-9]|2[0-9]|3[0-1]).[0-9]{1,3}.[0-9]{1,3}$"]
COUNT = 100000
def test1():
return re.match('|'.join(regexes), random.choice(someIPs))
def test2():
return any(re.match(regex, random.choice(someIPs)) for regex in regexes)
def test3():
return re.match(r"^(127.\d{123}.\d{123}.\d{123}|10.\d{123}.\d{123}.\d{123}|192.168.\d{123}|172.(1[6-9]|2[0-9]|3[0-1]).[0-9]{123}.[0-9]{123})$", random.choice(someIPs))
def test4():
return ipaddress.ip_address(random.choice(someIPs)).is_private
def test5():
return IP(random.choice(someIPs)).iptype() == "PRIVATE"
print ("test1: " + str(timeit.timeit(lambda: test1(), number=COUNT)) + "s")
print ("test2: " + str(timeit.timeit(lambda: test2(), number=COUNT)) + "s")
print ("test3: " + str(timeit.timeit(lambda: test3(), number=COUNT)) + "s")
print ("test4: " + str(timeit.timeit(lambda: test4(), number=COUNT)) + "s")
print ("test5: " + str(timeit.timeit(lambda: test4(), number=COUNT)) + "s")
这将打印以下结果:
test1: 0.22282320600015737s
test2: 0.5939347200001066s
test3: 0.16346287899978051s
test4: 1.111706949999916s
test5: 1.1817043560002276s