单元测试正则表达式以检查误报
Unit Testing regex to check for False Positives
所以我有一个 Regex 表达式,我将它与提供的单个字符串进行匹配,以检查和匹配某些信息。如果匹配,则只有捕获的组被 returned。我创建了我的函数,以便它从 returned 数组中删除所有空字符串,最后,只将捕获的字符串作为输出。这在 True Positives 的单元测试中非常有效。
现在,我想使用相同的表达式检查误报,但我似乎无法弄清楚如何在单元测试中演示它。我在一个文件中有一些测试字符串,正则表达式不应该匹配这些字符串,但事实并非如此。所以我的代码有效。但是当我试图在测试用例中实际展示它时,例如检查空字符串是否为 returned,我做不到。
我基本上想检查如果没有找到匹配项,那么它应该 return 一个空字符串。这是我的代码
match = re.findall(combined, narration)
result = list(filter(None, match[0]))
if match:
return result[0]
else:
result[0] = ""
return result[0]
第一个子句适用于匹配的字符串,returns 是单个字符串作为输出。在第二个子句中,我想输出一个空字符串,这样我就可以检查测试用例 .assertEqual
是否字符串不匹配。但是函数returns list index out of range
error.
谁能告诉我是否有更好的方法来使用正则表达式和单元测试来检查不匹配的字符串?
编辑 1: 根据要求添加预期的输入和输出
输入 1 - BRN CLG-CI IQ PAID ROHIT SINGH
输出 1 - ROHIT SINGH
输入 2 - BRN-TO CASH SELF
输出 2 - '' //空字符串
看来你可以使用re.findall
,检查它的输出,如果有匹配,过滤掉空匹配并打印第一个匹配。否则,打印一个空字符串。
import re
combined = r'^BRN.*?(?:paid|to)\s(?![A-Za-z\s]*\bself\b)([A-Za-z\s]+)'
narrations = ['BRN CLG-CI IQ PAID ROHIT SINGH','BRN-TO CASH SELF']
for narration in narrations:
print('-------',narration,sep='\n')
match = re.findall(combined, narration, flags=re.I)
if match:
result = list(filter(None, match))
print( result[0] )
else:
print( '' )
屈服
-------
BRN CLG-CI IQ PAID ROHIT SINGH
ROHIT SINGH
-------
BRN-TO CASH SELF
所以我有一个 Regex 表达式,我将它与提供的单个字符串进行匹配,以检查和匹配某些信息。如果匹配,则只有捕获的组被 returned。我创建了我的函数,以便它从 returned 数组中删除所有空字符串,最后,只将捕获的字符串作为输出。这在 True Positives 的单元测试中非常有效。
现在,我想使用相同的表达式检查误报,但我似乎无法弄清楚如何在单元测试中演示它。我在一个文件中有一些测试字符串,正则表达式不应该匹配这些字符串,但事实并非如此。所以我的代码有效。但是当我试图在测试用例中实际展示它时,例如检查空字符串是否为 returned,我做不到。
我基本上想检查如果没有找到匹配项,那么它应该 return 一个空字符串。这是我的代码
match = re.findall(combined, narration)
result = list(filter(None, match[0]))
if match:
return result[0]
else:
result[0] = ""
return result[0]
第一个子句适用于匹配的字符串,returns 是单个字符串作为输出。在第二个子句中,我想输出一个空字符串,这样我就可以检查测试用例 .assertEqual
是否字符串不匹配。但是函数returns list index out of range
error.
谁能告诉我是否有更好的方法来使用正则表达式和单元测试来检查不匹配的字符串?
编辑 1: 根据要求添加预期的输入和输出
输入 1 - BRN CLG-CI IQ PAID ROHIT SINGH
输出 1 - ROHIT SINGH
输入 2 - BRN-TO CASH SELF
输出 2 - '' //空字符串
看来你可以使用re.findall
,检查它的输出,如果有匹配,过滤掉空匹配并打印第一个匹配。否则,打印一个空字符串。
import re
combined = r'^BRN.*?(?:paid|to)\s(?![A-Za-z\s]*\bself\b)([A-Za-z\s]+)'
narrations = ['BRN CLG-CI IQ PAID ROHIT SINGH','BRN-TO CASH SELF']
for narration in narrations:
print('-------',narration,sep='\n')
match = re.findall(combined, narration, flags=re.I)
if match:
result = list(filter(None, match))
print( result[0] )
else:
print( '' )
屈服
-------
BRN CLG-CI IQ PAID ROHIT SINGH
ROHIT SINGH
-------
BRN-TO CASH SELF