首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用正则表达式或模式匹配从pymongo中的mongodb检索IP地址数据

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

Stack Overflow用户
提问于 2015-05-20 18:43:36
回答 1查看 629关注 0票数 1

我使用mongodb来存储我的数据,我习惯于跟随python脚本来执行一个查询来找到一个集合的计数,

代码语言:javascript
复制
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,

代码语言:javascript
复制
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模式,查询都应该检索此行。

代码语言:javascript
复制
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 addr10.20.30.40,20.35.45.55的特定行。我试图使用正则表达式来解决这个问题,如下所示,但是它显示了pymongo中的语法错误,在某些情况下没有检索任何行。

代码语言:javascript
复制
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模式:

代码语言:javascript
复制
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查询中提供什么样的语法或正则表达式?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-20 20:16:10

作为一种regex模式,pymongo接受常规的Python regex object。因此,您可以进行以下操作:

代码语言:javascript
复制
import re

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

count = my_collection.find({'ip_addr_field': regex}).count()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30357932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档