Именованные группы захвата регулярных выражений 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()
вызов.