Разбор регулярного выражения с помощью "|" (ИЛИ) в python - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь прочитать файл со следующим предложением регулярного выражения, используя python "pattern = (r '(? X) ((? <= \ Kauid =) | (? <= \ Kcomm =" nom) ) [\ S] + ') ", чтобы вернуть оба параметра регулярного выражения, но возвращает только первый </p>

вот мой код:

import regex
filename = "file.log"
pattern = (r'(?x)((?<=\Kauid=)|(?<=\Kcomm="nom))[\S]+')
matchvalues = []
new_output = []
comm = 'comm="nom-http"'
i = 0

with open(filename, 'r') as audit:
    lines = audit.readlines()

    for line in lines:
        match = regex.search(pattern, line)
        if match:
            new_line = match.group()
            print(new_line)
            matchvalues.append(new_line)

matchvalues_size = len(matchvalues)
print(matchvalues)

Ребята, вы можете мне помочь, пожалуйста?

1 Ответ

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

Обычно \K не используется в поиске назад, поскольку его значение состоит в том, чтобы обеспечить успешное совпадение в текущей позиции, и обычно не требуется, чтобы поиск назад был частью текущего совпадения. Поэтому я не знаю, почему вы используете ретроспективы переменной длины, для которых для начала требуется пакет regex. Тем не менее, у меня не было проблем с сопоставлением 'comm="nom-http"' с вашим регулярным выражением:

>>> pattern = (r'(?x)((?<=\Kauid=)|(?<=\Kcomm="nom))[\S]+')
... comm = 'comm="nom-http"'
... regex.search(pattern, comm)
<regex.Match object; span=(0, 15), match='comm="nom-http"'>

Обратите внимание, что comm="nom является частью совпадения из-за наличия \K в регулярном выражении.

Но проще было бы использовать:

pattern = r'((?:auid=|comm="nom)\S+)'

Итак, в чем проблема? Когда вы говорите: «Он возвращает только первое», вы имеете в виду не шаблон, а первое вхождение в строке, потому что может быть несколько вхождений? Если это так, то вместо выполнения regex.search выполните команду regex.findall, которая вернет список совпадений строка .

import re
pattern = r'((?:auid=|comm="nom)\S+)'
matches = re.findall(pattern, line)
...