为了账号安全,请及时绑定邮箱和手机立即绑定

使用正则表达式作为 python 的“in”关键字的搜索字符串

使用正则表达式作为 python 的“in”关键字的搜索字符串

人到中年有点甜 2023-09-26 17:09:16
假设我有一本路径集字典:my_dict['some_key'] = {'abc/hi/you','xyz/hi/you','jkl/hi/you'}我想看看这条路径是否出现在这个集合中。如果我有完整的路径,我只需执行以下操作:str = 'abc/hi/you'if str in my_dict['some_key']:    print(str)但如果我不知道和b之间是什么怎么办?如果它实际上可以是任何东西呢?如果我是在一个壳里,我就会把它收起来。acls*我想要做的是让 str 成为 regx:regx = '^a.*c/hi/you$' #just assume this is the ideal regex. Doesn't really matter.if regx in my_dict['some_key']:    print('abc/hi/you') #print the actual path, not the regx实现这样的事情的干净、快速的方法是什么?
查看完整描述

2 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

您需要循环遍历集合而不是简单的调用。


为了避免为示例设置整个集合字典,我将其抽象为简单的 my_set。


import re

my_set = {'abc/hi/you','xyz/hi/you','jkl/hi/you'}

regx  = re.compile('^a.*c/hi/you$')

for path in my_set:

    if regx.match(path):

        print(path)

我选择编译而不是仅仅re.match()因为该集合在实际实现中可能有超过 100 万个元素。


查看完整回答
反对 回复 2023-09-26
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

您可以set子类化该类并实现a in b运算符


import re

from collections import defaultdict


class MySet(set):

  def __contains__(self, regexStr):

    regex = re.compile(regexStr)

    for e in self:

      if regex.match(e):

        return True

    return False


my_dict = defaultdict(MySet)


my_dict['some_key'].add('abc/hi/you')


regx = '^a.*c/hi/you$'

if regx in my_dict['some_key']:

    print('abc/hi/you')


查看完整回答
反对 回复 2023-09-26
  • 2 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信