检查字符串是否与少数正则表达式匹配

时间:2015-06-10 09:30:29

标签: python regex

我想检查一个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更好的方法?

3 个答案:

答案 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)

不要忘记ipaddressIPy.IP更简单,更不易出故障的解决方案。虽然ipaddressIPy.IP比直接RegEx测试慢得多,但它们做得很好,而且您不必一直“重新发明轮子”。 另外:即使你测试了数百万个IP地址,ipaddressIPy.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