Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用正则表达式或模式匹配从pymongo中的mongodb检索IP地址数据_Python_Regex_Mongodb_Ip_Database - Fatal编程技术网

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

Python 使用正则表达式或模式匹配从pymongo中的mongodb检索IP地址数据,python,regex,mongodb,ip,database,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

我使用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
查询中应该给出什么样的语法或正则表达式来实现这一点?

作为
regex
模式,pymongo接受一个正则的
Python regex对象。因此,您可以执行以下操作:

import re

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

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