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

Для вывода необходимо заменить скобки, содержащие цифры с точками '.'. Также удалите скобки в начале и конце домена.

Можем ли мы использовать для этого re.sub и если да, то как?

код

import re

log = ["4/19/2020 11:59:09 PM 2604 PACKET  0000014DE1921330 UDP Rcv 192.168.1.28   f975   Q [0001   D   NOERROR] A      (7)pagead2(17)googlesyndication(3)com(0)",
       "4/19/2020 11:59:09 PM 0574 PACKET  0000014DE18C4720 UDP R cv 192.168.2.54    9c63   Q [0001   D   NOERROR] A      (2)pg(3)cdn(5)viber(3)com(0)"]

rx_dict = { 'query': re.compile(r'(?P<query>[\S]*)$') }

for item in log:
    for key, r_exp in rx_dict.items():
        print(f"{r_exp.search(item).group(1)}")

выход

(7)pagead2(17)googlesyndication(3)com(0)
(2)pg(3)cdn(5)viber(3)com(0)

предпочтительный выход

pagead2.googlesyndication.com
pg.cdn.viber.com

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Pragmati c python использование:

log = ["4/19/2020 11:59:09 PM 2604 PACKET  0000014DE1921330 UDP Rcv 192.168.1.28   f975   Q [0001   D   NOERROR] A      (7)pagead2(17)googlesyndication(3)com(0)",
       "4/19/2020 11:59:09 PM 0574 PACKET  0000014DE18C4720 UDP R cv 192.168.2.54    9c63   Q [0001   D   NOERROR] A      (2)pg(3)cdn(5)viber(3)com(0)"]

import re

urls = [re.sub(r'\(\d+\)','.',t.split()[-1]).strip('.') for t in log]

print (urls)

Вывод:

['pagead2.googlesyndication.com', 'pg.cdn.viber.com']

Уточнение словаря по правилам:

Если вы хотите применять последовательные правила через словарь, go lambda полностью:

import re 

rules = {"r0": lambda x: x.split()[-1],
         "r1": lambda x: re.sub(r'\(\d+\)','.',x),
         "r2": lambda x: x.strip(".")}

result = []
for value in log:  
    result.append(value)
    for r in rules:
        result[-1] = rules[r](result[-1])

print(result)

Вывод:

['pagead2.googlesyndication.com', 'pg.cdn.viber.com']
0 голосов
/ 21 апреля 2020

Да, вы можете использовать re.sub. Я предполагаю, что у вас есть этот словарь, чтобы вы могли извлечь несколько частей из журнала. Вы можете сделать что-то подобное для dispatch :

ops = {
    "query": lambda e: (
         re.sub(r"\(\d+\(", ".", (
             re.search(r"(?P<query>[\S]*)$", e).group(1),
         )
     ),
     ...
}

, а затем применить функции ко всем журналам

log_results = {op_name: op(l) for op_name, op in ops.items() for l in log}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...