Выражение, которое захватывает все символы до группы символов

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

alert - name risk score - severity - total

Примерами таких предупреждений могут быть:

A member was added to a security-enabled local group 47 medium 2
A member was added to a security-enabled universal group 47 medium 1
A security-enabled global group was changed 73 high 2
A security-enabled local group was changed 73 high 2
A user account was locked out  47 medium 31
An attempt was made to reset an accounts password  73 high 14
Member added to security-enabled global group  73 high 2
PowerShell Keylogging Script 73 high 23
PowerShell Suspicious Script with Audio Capture Capabilities 47 medium 23
More Than 3 Failed Login Attempts Within 1 Hour  47 medium 6
Over 100 Connection from 10 Diff. IPs 47 medium 234
Over 100 Connections Attempted 73 high 123
Failed Logins Not Followed by Success Within 2 Hours 21 low 8

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

^(\D*)

По сути, это отфильтровывает все цифры, но теперь я получил несколько предупреждений, которые не учел. Эти предупреждения содержат цифры. Например:

More Than 3 Failed Login Attempts Within 1 Hour  47 medium 6
Over 100 Connection from 10 Diff. IPs 47 medium 234
Over 100 Connections Attempted 73 high 123
Failed Logins Not Followed by Success Within 2 Hours 21 low 8

Поэтому мне нужно иметь возможность захватить полное имя, иначе я получаю:

More than
Over
Over
Failed Logins Not Followed by Success Within

Несмотря на мои усилия, мне не удалось уловить паттерн желания. Это будет желаемый результат:

A member was added to a security-enabled local group
A member was added to a security-enabled universal group
A security-enabled global group was changed
A security-enabled local group was changed
A user account was locked out 
An attempt was made to reset an accounts password 
PowerShell Keylogging Script 
PowerShell Suspicious Script with Audio Capture Capabilities
More Than 3 Failed Login Attempts Within 1 Hour
Over 100 Connection from 10 Diff. IPs 
Over 100 Connections Attempted
Failed Logins Not Followed by Success Within 2 Hours

Спасибо, что нашли время помочь!

Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
1
0
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Следующее регулярное выражение должно помочь: .*\b(?= \d* .* \d*$)

Синтаксис (?=...) называется опережением, и он позволяет нам указать текст, который должен следовать за указанным регулярным выражением. Здесь мы, по сути, ищем все, что следует по шаблону: пробел, число, пробел, что угодно, пробел, число, конец строки.

Эй, Сон, я попробовал твое предложение, но оно не совсем сработало. Я не уверен, почему. Я проголосовал за ваш ответ, но выбрал @JamiuS». ответ, который работал для меня. Спасибо, что нашли время помочь!

CUI 21.02.2023 01:52

Спасибо за отзыв @CUI. У вас есть пример, когда это не удается, чтобы я мог исправить ответ для будущих пользователей?

Seon 21.02.2023 13:46

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

CUI 21.02.2023 16:56
Ответ принят как подходящий

Вот альтернативный вариант. Примечание. Я предполагаю, что alerts — это список строк. Шаблон соответствует любой строке символов в начале строки ^(.*), за которой следует \s, которая соответствует любому символу пробела. (\d+) соответствует одной или нескольким цифрам, затем одной или нескольким буквам (\w+) и одной или нескольким цифрам (\d+) в конце строки ($).

import re

data = """
A member was added to a security-enabled local group 47 medium 2
A member was added to a security-enabled universal group 47 medium 1
A security-enabled global group was changed 73 high 2
A security-enabled local group was changed 73 high 2
A user account was locked out  47 medium 31
An attempt was made to reset an accounts password  73 high 14
Member added to security-enabled global group  73 high 2
PowerShell Keylogging Script 73 high 23
PowerShell Suspicious Script with Audio Capture Capabilities 47 medium 23
More Than 3 Failed Login Attempts Within 1 Hour  47 medium 6
Over 100 Connection from 10 Diff. IPs 47 medium 234
Over 100 Connections Attempted 73 high 123
Failed Logins Not Followed by Success Within 2 Hours 21 low 8
"""

alerts = data.splitlines()

pattern = re.compile(r'^(.*)\s\d+\s\w+\s\d+$')

for alert in alerts:
    res = pattern.search(alert)
    if res:
        print(res.group(1))

Вы также можете использовать понимание списка, чтобы сохранить все совпадения, а затем распаковать весь список вместо использования описанного выше цикла for для печати одного совпадения за раз:

res = [pattern.search(alert).group(1) 
        for alert in alerts if pattern.search(alert)]
print(*res, sep = "\n")

A member was added to a security-enabled local group
A member was added to a security-enabled universal group
A security-enabled global group was changed
A security-enabled local group was changed
A user account was locked out
An attempt was made to reset an accounts password
Member added to security-enabled global group
PowerShell Keylogging Script
PowerShell Suspicious Script with Audio Capture Capabilities
More Than 3 Failed Login Attempts Within 1 Hour
Over 100 Connection from 10 Diff. IPs
Over 100 Connections Attempted
Failed Logins Not Followed by Success Within 2 Hours

Эй, это сработало хорошо. Спасибо, что нашли время помочь!

CUI 21.02.2023 01:52

Другие вопросы по теме