Именованные группы захвата регулярных выражений Python

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

Возникла проблема, когда я не смог понять, как написать оператор 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, чтобы проверить, есть ли совпадения для всей именованной группы.

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

КОД:

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 ответа

Решение

После ответа @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')

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

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