Python журналов поиска с использованием подстановочных знаков - PullRequest
2 голосов
/ 20 июня 2020

У меня есть очень большой набор данных netflow, который выглядит примерно так:

192.168.1.3  www.123.com
192.168.1.6  api.123.com
192.168.1.3  blah.123.com
192.168.1.3  www.google.com
192.168.1.6  www.xyz.com
192.168.1.6  test.xyz.com
192.168.1.3  3.xyz.co.uk
192.168.1.3  www.blahxyzblah.com
....

У меня также есть гораздо меньший набор данных доменов с подстановочными знаками, которые выглядят следующим образом:

*.xyz.com
api.123.com
...

I Я бы хотел иметь возможность искать в моем наборе данных и находить все совпадения, используя python. Итак, в приведенном выше примере я бы сопоставил:

192.168.1.6  www.xyz.com
192.168.1.6  test.xyz.com
192.168.1.6  api.123.com

Моя попытка использовать модуль re, но не могу сопоставить его ни с чем.

for f in offendingsites:
    for l in logs:
        if re.search(f,l):
            print(l)

Ответы [ 2 ]

4 голосов
/ 20 июня 2020

Сайты-нарушители, которые у вас есть, не являются регулярными выражениями, это подстановочные знаки оболочки. Однако вы можете использовать fnmatch.translate для преобразования их в регулярные выражения:

for f in offendingsites:
    r = fnmatch.translate(f)
    for l in logs:
        if re.search(r, l):
            print(l)
1 голос
/ 20 июня 2020

Вы также можете использовать fnmatch.fnmatch() для поиска по шаблону подстановки.

Демо:

from fnmatch import fnmatch

with open("wildcards.txt") as offendingsites, open("dataset.txt") as logs:
    for f in offendingsites:
        for l in logs:
            f, l = f.strip(), l.strip() # Remove whitespace
            if fnmatch(l, f):
                print(l)

Вывод:

192.168.1.6  www.xyz.com
192.168.1.6  test.xyz.com
...