使用正则表达式或模式匹配从pymongo中的mongodb检索IP地址数据

时间:2015-05-20 18:43:36

标签: python regex mongodb ip database

我正在使用mongodb来存储我的数据,我习惯使用python脚本执行查询来查找集合的数量,

collection_name = "prodresultlistCollection_%s_%s" %(sys.argv[1], sys.argv[2])
my_collection = mydb[collection_name]

parameter = "IP addr"
ip = "10.20.30.40"
count1 = my_collection.count({ '$and': [{parameter:'%s' %(ip)}]})

此处count1显示具有给定ip值的行数。此count1查询仅计算ip == IP addr的行数。但是在数据库中,IP addr属性可以具有以下格式的一个或多个IP,

10.20.30.40
10.20.30.40,20.35.45.55
10.20.30.40,20.35.45.55,10.10.10.10
etc...

考虑数据库中的IP addr值为10.20.30.40,20.35.45.55,然后给出ip的任何模式,查询应检索此行。

ip = 10
ip = 10.20
ip = 10.20.30
ip = 10.20.30.40
ip = 20
ip = 20.35
ip = 20.35.45
ip = 20.35.45.55

ip查询count1的所有上述情况中,应检索IP addr值为10.20.30.40,20.35.45.55的数据库中的特定行。我尝试使用正则表达式解决问题,如下所示,但它在pymongo中显示语法错误,在某些情况下没有检索到行。

count1 = my_collection.count({ '$and': [{parameter:/'%s'/ %(ip)}]})
count1 = my_collection.count({ '$and': [{parameter:'/%s/' %(ip)}]})
count1 = my_collection.count({ '$and': [{parameter:/%s/ %(ip)}]})

然后我尝试使用以下代码使用正则表达式匹配IP模式:

import re

IP = raw_input("Enter the IP: ")
S = IP.split(".")
IP_DB = "10.20.30.40,20.35.45.55"

if len(S)==4:
    obj = re.search(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",IP_DB)
elif len(S)==3:
    obj = re.search(r"^\d{1,3}\.\d{1,3}\.\d{1,3}",IP_DB)
elif len(S)==2:
    obj = re.search(r"^\d{1,3}\.\d{1,3}",IP_DB)
elif len(S)==1:
    obj = re.search(r"^\d{1,3}",IP_DB)
else:
    print "Invalid IP!!!"

if obj:
    print obj.group()
else:
    print "Nothing found!!!"

但问题在于,它只比较IP的模式而不是值。对于模式xx.xx.xx.xx中给出的任何IP值,此代码返回true以匹配/搜索结果。此处不考虑IP的第二部分。有没有更好的方法来解决这个问题?我需要使用ip从mongodb数据库中检索行,这样任何给定的ip模式都匹配数据库中的IP addr。在count1查询中应该给出什么样的语法或正则表达式才能实现这一点?

1 个答案:

答案 0 :(得分:1)

作为regex模式,pymongo接受常规Python regex object。所以你可以做到以下几点:

import re

regex = re.compile('{}'.format(YOUR_IP_ADDR))

count = my_collection.find({'ip_addr_field': regex}).count()