【问题标题】:Python Regular Expression Named Capture GroupsPython 正则表达式命名捕获组
【发布时间】:2019-03-17 05:32:06
【问题描述】:

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

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

代码的工作原理或应该工作原理是 findVul() 经过 data1data2,已添加到列表中我的数据

如果正则表达式找到整个命名组的匹配项,那么它应该打印出结果。它目前运行良好。

代码:

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 中的漏洞。

有人可以解释一下正确的方法以及为什么我的逻辑是错误的。 非常感谢:) !!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 附注:您可以使用(vulnerabilit(?:y|ies)) 部分缩短您的正则表达式 :) 但另一方面它变得不那么清晰了。 Demo on Regex101
    【解决方案2】:

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

    【讨论】:

    • 非常感谢 AdamKG! ,这是我第一次使用 re.finditer() 函数,我通常使用 re.findall() 。实施 re.finditer() 是找到我的命名捕获组的最佳方法还是有更好的方法?
    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多