строки с соответствующими символами подстановки - PullRequest
1 голос
/ 16 июля 2010

Мне нужно сопоставить две строки с простыми подстановочными знаками:

"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 ]

6 голосов
/ 16 июля 2010

Это должно работать для вас:

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.
0 голосов
/ 09 сентября 2016

На тот случай, если другие наткнуться на этот поток (как я), я предлагаю использовать модуль "fnmatch" (см. https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch02s03.html) для сопоставления строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...