带通配符的字符串匹配

1 投票
2 回答
5774 浏览
提问于 2025-04-16 01:22

我需要用简单的通配符来匹配两个字符串:

"oh.my.*" 可以匹配 "*.my.life""oh.my.goodness""*.*.*",但不能匹配 "in.my.house"

这里唯一的通配符是 *,它可以替代任何字符的字符串(除了 . 这个符号)

我考虑过用 fnmatch,但它不支持文件名中的通配符。

现在我在用一些正则表达式的代码——我觉得如果能有更简单的方法就好了:

def notify(self, event, message):
    events = []
    r = re.compile(event.replace('.','\.').replace('*','[^\.]+'))
    for e in self._events:
        if r.match(e):
            events.append(e)
        else:
            if e.find('*')>-1:
                r2 = re.compile(e.replace('.','\.').replace('*','[^\.]+'))
                if r2.match(event):
                    events.append(e)
    for event in events:
        for callback in self._events[event]:
            callback(self, message)

2 个回答

0

如果其他人像我一样看到这个讨论,我建议使用“fnmatch”模块来进行字符串匹配。你可以查看这个链接了解更多信息:https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch02s03.html

6

这个方法应该适合你:

def is_match(a, b):
    aa = a.split('.')
    bb = b.split('.')
    if len(aa) != len(bb): return False
    for x, y in zip(aa, bb):
        if not (x == y or x == '*' or y == '*'): return False
    return True

它是怎么工作的:

  • 首先用.把输入分开。
  • 如果输入的部分数量不一样,那就直接失败。
  • 否则,逐个检查这些部分是否相等。
  • 如果其中有部分是*,那也算是匹配成功。
  • 如果有任何部分不匹配,就返回False;如果全部匹配,就返回True。

撰写回答