Python 正则表达式命名捕获组
Python Regular Expression Named Capture Groups
我正在学习正则表达式,特别是命名捕获组。
遇到一个问题,我无法弄清楚如何为我的函数 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.
中应该存在的漏洞
谁能解释一下正确的方法以及为什么我的逻辑是错误的。
非常感谢 :) !!
问题是 re.finditer()
returns 一个在你做 len(list(match)) != 0
测试时计算的迭代器;当您在 for 循环中再次遍历它时,它已经用完并且没有剩余的项目。简单的解决方法就是在 finditer()
调用之后添加 match = list(match)
行。
@AdamKG 回复后我做了更多研究。
我想使用 re.findall() 函数。
re.findall() 将 return 列出所有匹配的子字符串。在我的例子中,我在命名的捕获组中有捕获组。这将 return 一个包含元组的列表。
例如以下带有数据 1 的正则表达式:
pattern = re.compile(r'(?P<VUL>(\d{1,2}|One)\s+
(vulnerabilities|vulnerability)\s+discovered)')
match = re.findall(pattern, data)
将return一个包含元组的列表:
[('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')
我正在学习正则表达式,特别是命名捕获组。
遇到一个问题,我无法弄清楚如何为我的函数 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.
中应该存在的漏洞谁能解释一下正确的方法以及为什么我的逻辑是错误的。 非常感谢 :) !!
问题是 re.finditer()
returns 一个在你做 len(list(match)) != 0
测试时计算的迭代器;当您在 for 循环中再次遍历它时,它已经用完并且没有剩余的项目。简单的解决方法就是在 finditer()
调用之后添加 match = list(match)
行。
@AdamKG 回复后我做了更多研究。
我想使用 re.findall() 函数。
re.findall() 将 return 列出所有匹配的子字符串。在我的例子中,我在命名的捕获组中有捕获组。这将 return 一个包含元组的列表。
例如以下带有数据 1 的正则表达式:
pattern = re.compile(r'(?P<VUL>(\d{1,2}|One)\s+
(vulnerabilities|vulnerability)\s+discovered)')
match = re.findall(pattern, data)
将return一个包含元组的列表:
[('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')