带有通配符匹配的字符串

时间:2010-07-15 20:41:34

标签: python regex string

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

"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 :(得分: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。

答案 1 :(得分:0)

万一其他人偶然发现这个帖子(就像我一样),我建议使用" fnmatch"模块(参见https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch02s03.html)进行字符串匹配。