Извлечение паттернов с Python reg exp - PullRequest
0 голосов
/ 13 февраля 2020

Строка образца 1:

::SCOPE:Confidentiality:SCOPE:Access Control:SCOPE:AuthorizationTECHNICAL IMPACT:Gain Privileges::

Строка образца 2:

::SCOPE:ConfidentialityTECHNICAL IMPACT:Read Data::

Строка образца 3:

::SCOPE:AvailabilityTECHNICAL IMPACT:Unreliable Execution::SCOPE:Confidentiality:SCOPE:Integrity:SCOPE:AvailabilityTECHNICAL IMPACT:Execute Unauthorized Commands:NOTE:Confidentiality Integrity Availability Execute Unauthorized Commands Run Arbitrary Code::SCOPE:ConfidentialityTECHNICAL IMPACT:Read Data::SCOPE:IntegrityTECHNICAL IMPACT:Modify Data::SCOPE:Confidentiality:SCOPE:Access Control:SCOPE:AuthorizationTECHNICAL IMPACT:Gain Privileges::

Для строки образца 1 я хотел бы извлечь -

Confidentiality
Access Control
Authorization
Gain Privileges

Для образца строки 2, я хотел бы извлечь -

Confidentiality
Read Data

Для образца строки 3: я хотел бы извлечь -

1 - 
Availability
Unreliable Execution

2- Конфиденциальность Доступность целостности Выполнение неавторизованных команд

3- Конфиденциальность чтения данных

4- Целостность Изменение данных

5- Конфиденциальность Контроль доступа Авторизация Привилегии получения

Я начал писать простой reg exp -

::SCOPE:([\w\s]+)TECHNICAL IMPACT:([\w\s]+) 

, который будет извлекать строку 2.

Затем я написал reg exp -

::SCOPE:([\w\s]+):SCOPE:([\w\s]+):SCOPE:([\w\s]+)TECHNICAL IMPACT:([\w\s]+)

, который extract String 3.

Однако эти выражения имеют следующий вид: c.

Общее, что я вижу, - :: SCOPE: [часть 1 для извлечения] TECHNICAL ВОЗДЕЙСТВИЕ: [часть 2 для извлечения] Этот общий шаблон может присутствовать в нескольких частях данной строки, но [часть 1 до e xtract] является переменной с тем, что должно быть извлечено.

Как я могу найти этот общий шаблон в строке столько раз, чем извлечь из каждого с помощью reg exp?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Я бы использовал re.split для этой задачи следующим образом:

import re
s1 = '::SCOPE:Confidentiality:SCOPE:Access Control:SCOPE:AuthorizationTECHNICAL IMPACT:Gain Privileges::'
s2 = '::SCOPE:ConfidentialityTECHNICAL IMPACT:Read Data::'
s3 = '::SCOPE:AvailabilityTECHNICAL IMPACT:Unreliable Execution::SCOPE:Confidentiality:SCOPE:Integrity:SCOPE:AvailabilityTECHNICAL IMPACT:Execute Unauthorized Commands:NOTE:Confidentiality Integrity Availability Execute Unauthorized Commands Run Arbitrary Code::SCOPE:ConfidentialityTECHNICAL IMPACT:Read Data::SCOPE:IntegrityTECHNICAL IMPACT:Modify Data::SCOPE:Confidentiality:SCOPE:Access Control:SCOPE:AuthorizationTECHNICAL IMPACT:Gain Privileges::'
ext1 = [i for i in re.split(r'[:A-Z ]*:', s1) if i]
ext2 = [i for i in re.split(r'[:A-Z ]*:', s2) if i]
ext3 = [i for i in re.split(r'[:A-Z ]*:', s3) if i]

Тогда:

  • ext1 равно ['Confidentiality', 'Access Control', 'Authorization', 'Gain Privileges']
  • ext2 равно ['Confidentiality', 'Read Data']
  • ext3 - это ['Availability', 'Unreliable Execution', 'Confidentiality', 'Integrity', 'Availability', 'Execute Unauthorized Commands', 'Confidentiality Integrity Availability Execute Unauthorized Commands Run Arbitrary Code', 'Confidentiality', 'Read Data', 'Integrity', 'Modify Data', 'Confidentiality', 'Access Control', 'Authorization', 'Gain Privileges']

Я просто искал подстроки, состоящие из :, пробелов и заглавных букв и заканчивающиеся : для разделения, затем удалил пустые str с из list с производства re.split с

1 голос
/ 13 февраля 2020

Единственный трюк, необходимый для того, чтобы захватить все слова, но игнорировать последовательные серии прописных букв.

print (re.findall(r'[A-Z]?[a-z]+(?: [A-Z]?[a-z]+)*', text))

Он возвращает следующее для ваших тестовых случаев:

  1. [ «Конфиденциальность», «Контроль доступа», «Авторизация», «Получение привилегий»]

  2. [«Конфиденциальность», «Чтение данных»]

  3. ['Доступность', 'Ненадежное выполнение', 'Конфиденциальность', 'Целостность', 'Доступность', 'Выполнить неавторизованные команды', 'Конфиденциальность Доступность целостности Выполнить неавторизованные команды Выполнить произвольный код', 'Конфиденциальность', 'Чтение данных' , «Целостность», «Изменить данные», «Конфиденциальность», «Контроль доступа», «Авторизация», «Получение привилегий»]

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