Python正则表达式命名为捕获组

时间:2018-10-12 03:29:33

标签: python regex python-3.x capture-group named-captures

我正在学习正则表达式,特别是捕获组。

有一个问题,我无法弄清楚如何为函数 findVul()编写if / else语句。

代码的基本工作方式或工作方式是 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 个答案:

答案 0 :(得分:1)

问题是re.finditer()返回一个迭代器,该迭代器在进行len(list(match)) != 0测试时会被评估;当您在for循环中再次对其进行迭代时,它已经耗尽,并且没有剩余的项目。简单的解决方法是在match = list(match)调用之后添加finditer()行。

答案 1 :(得分:0)

在@AdamKG回复后,我做了更多研究。

我想使用re.findall()函数。

re.findall()将返回所有匹配的子字符串的列表。就我而言,我的命名捕获组内部有捕获组。这将返回一个包含元组的列表。

例如具有data1的以下正则表达式:

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')