在Python中,如何将字符串与字典项匹配(如“Bra*”)

2024-10-04 05:23:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python的新手,所以请原谅我问了一些愚蠢的问题。 从一个文本文件中,一个字典被用作传递/块过滤器。 textfile包含地址和一个block或allow,如“00209568,allow”或“0011*,allow”(不带引号)。 搜索输入是一个包含完整代码的字符串,如“001180000”。 如何评估搜索项是否在字典中并使其与“0011*,allow”行匹配? 非常感谢你的努力!你知道吗

筛选器字典由以下内容组成:

def loadFilterDict(filename):
global filterDict
try:
    with open(filename, "r") as text_file:
        lines = text_file.readlines()
        for s in lines:
            fields = s.split(',')
            if len(fields) == 2:
                filterDict[fields[0]] = fields[1].strip()
    text_file.close()
except:
    pass

检查代码(ccode)是否在字典中:

    if ccode in filterDict:                   
                if filterDict[ccode] in ['block']:
                    continue
            else:
                if filterstat in ['block']:
                    continue

过滤器文件类似于:

00209568,允许 000923993,允许 0011*,允许


Tags: 代码textin过滤器fieldsif字典filename
2条回答

如果您可以使用re,那么您不必担心通配符,而是让^{}为您做一些艰苦的工作:

# Rules input (this could also be read from file)
lines = """002029568,allow
0011*,allow
001180001,block
"""

# Parse rules from string
rules = []
for line in lines.split("\n"):
    line = line.strip()
    if not line:
        continue
    identifier, ruling = line.split(",")
    rules += [(identifier, ruling)]

# Get rulings for specific number
def rule(number):
    from re import match
    rulings = []
    for identifier, ruling in rules:
        # Replace wildcard with regex .*
        identifier = identifier.replace("*", ".*")
        if match(identifier, number):
            rulings += [ruling]
    return rulings

print(rule("001180000"))
print(rule("001180001"))

打印内容:

['allow']
['allow', 'block']

函数将返回一个规则列表。它们的顺序与它们在配置行中出现的顺序相同。所以你可以很容易地选择最后一条或第一条你感兴趣的规则。你知道吗

或者过早地打破循环,如果你可以假设没有两个裁决会干涉。你知道吗

示例:

  • 001180000只与0011*,allow匹配,因此唯一适用的规则是allow。你知道吗
  • 001180001首先由0011*,allow匹配,所以您将得到allow和前面一样。但是,它也与001180001,block匹配,因此block也将被添加到规则中。你知道吗

如果文件中的通配符条目具有固定长度(例如,您只需要支持0011*,allow这样的行,而不需要00110*,allow0*,allow或任何其他任意数量的数字后跟*),则可以使用嵌套字典,其中外键是通配符条目的已知部分。你知道吗

d = {'0011': {'001180000': 'value', '001180001': 'value'}}

然后,当解析文件并到达第0011*,allow行时,不需要进行任何匹配。你所要做的就是检查'0011'是否存在。粗略的例子:

d = {'0011': {'001180000': 'value', '001180001': 'value'}}

line = '0011*,allow'
prefix = line.split(',')[0][:-1]
if prefix in d:
    # there is a "match", then you can deal with all the entries that match,
    # in this case the items in the inner dictionary
    # {'001180000': 'value', '001180001': 'value'}
    print('match')
else:
    print('no match')

如果您确实需要支持任意长度的通配符条目,您将不得不求助于循环遍历字典(因此不必从使用字典开始):

d = {'001180000': 'value', '001180001': 'value'}

line = '0011*,allow'
prefix = line.split(',')[0][:-1]
for k, v in d.items():
    if k.startswith(prefix):
        # found matching key-value pair
        print(k, v)

相关问题 更多 >