Именованные группы захвата регулярных выражений Python - PullRequest
0 голосов
/ 12 октября 2018

Я изучаю регулярные выражения, специально названные группы захвата.

Возникла проблема, из-за которой я не могу понять, как написать оператор if / else для моей функции findVul () .

Как работает или должен работать код, так это то, что findVul () проходит через data1 и data2 , которые были добавлены всписок myDATA .

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

КОД:

import re

data1 = '''

dwadawa231d .2 vulnerabilities discovered dasdfadfad .One vulnerability discovered 123e2121d21 .12 vulnerabilities discovered sgwegew342 dawdwadasf

2r3232r32ee

'''

data2 = ''' d21d21 .2 vul discovered adqdwdawd .One vulnerability disc d12d21d .two vulnerabilities discovered 2e1e21d1d f21f21

'''

def findVul(data):
    pattern = re.compile(r'(?P<VUL>(\d{1,2}|One)\s+(vulnerabilities|vulnerability)\s+discovered)')
    match = re.finditer(pattern, data)

    for x in match:
        print(x.group())


myDATA = [data1,data2] count_data = 1

for x in myDATA:
    print('\n--->Reading data{0}\n'.format(count_data))
    count_data+=1
    findVul(x)

ВЫХОД:

--->Reading data1

2 vulnerabilities discovered
One vulnerability discovered
12 vulnerabilities discovered

--->Reading data2

Теперь я хочу добавитьоператор if / else, чтобы проверить, есть ли какие-либо совпадения для всей именованной группы.

Я пробовал что-то подобное, но, похоже, это не работает.

CODE:

def findVul(data):
    pattern = re.compile(r'(?P<VUL>(\d{1,2}|One)\s+(vulnerabilities|vulnerability)\s+discovered)')
    match = re.finditer(pattern, data)

    if len(list(match)) != 0:
        print('\nVulnerabilities Found!\n')
        for x in match:
            print(x.group())

    else:
        print('No Vulnerabilities Found!\n')

ВЫХОД:

--->Reading data1


Vulnerabilities Found!


--->Reading data2

No Vulnerabilities Found!

Как вы можете видеть, он не печатает уязвимости, которые должны быть в data1 .

Может кто-нибудь объяснить, пожалуйста, правильный способ сделать это и почему моя логика неверна.Большое спасибо :) !!

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Я провел еще несколько исследований после ответа @AdamKG.

Я хотел использовать функцию re.findall ().

re.findall () вернет список всех соответствующих подстрок,В моем случае у меня есть группы захвата внутри моей именованной группы захвата.Это вернет список с кортежами.

Например, следующее регулярное выражение с данными1:

pattern = re.compile(r'(?P<VUL>(\d{1,2}|One)\s+ 
(vulnerabilities|vulnerability)\s+discovered)')

match = re.findall(pattern, data)

Вернет список с кортежами:

[('2 vulnerabilities discovered', '2', 'vulnerabilities'), ('One vulnerability 
discovered', 'One', 'vulnerability'), ('12 vulnerabilities discovered', '12', 
'vulnerabilities')]

Мой окончательный код для findVul ():

pattern = re.compile(r'(?P<VUL>(\d{1,2}|One)\s+(vulnerabilities|vulnerability)\s+discovered)')
match = re.findall(pattern, data)

if len(match) != 0:
    print('Vulnerabilties Found!\n')
    for x in match:
        print('--> {0}'.format(x[0]))
else:
    print('No Vulnerability Found!\n')
0 голосов
/ 12 октября 2018

Проблема в том, что re.finditer() возвращает итератор, который оценивается при выполнении теста len(list(match)) != 0;когда вы повторяете его снова в цикле for, он уже исчерпан и элементов больше не осталось.Простое исправление заключается в добавлении строки match = list(match) после вызова finditer().

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